Szukam interfejsu API, który pozwoli mi zalogować się do użytkownika, przekazując mu nazwę użytkownika i hasło. Czy ktoś ma z tym doświadczenie?
Aby to wyjaśnić, próbuję utworzyć pole logowania AJAX, które pojawi się jako wyskakujące okienko na stronie głównej, i nie odświeżaj strony w przypadku nieprawidłowych poświadczeń, ale tylko wtedy, gdy logowanie jest prawidłowe. Oto co zrobiłem do tej pory:
Aktualizacja
Teraz ładuję formularz logowania na mojej stronie głównej, a po przesłaniu uruchamiam żądanie AJAX, które wysyła poświadczenie do tego skryptu:
function user_login_submit_try() {
global $user;
$uid = user_authenticate($_POST['name'],$_POST['pass']);
$arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
if ($uid){
$user = user_load($uid);
user_login_finalize($arr);
}
echo drupal_json_encode($uid);
exit;
};
Jak dotąd działa, ale moje obawy dotyczą (jak wspomniano w googletorp) problemów bezpieczeństwa; Wygląda na to, że żaden interfejs API użyty w tym skrypcie i tak nie zdezynfekował danych.
Czy ktoś widziałby lepszy sposób?
Odpowiedzi:
To może pomóc komuś:
Lepsza wersja oparta na komentarzu:
źródło
hook_user_insert
ale powyższe funkcje w odpowiedzi wymagają hasła jako oryginalnego zwykłego tekstu. Chyba będę musiał spróbowaćhook_form_alter
zamiast tego ...Nie ma do tego prostej funkcji API.
Możesz robić to, co robi Drupal:
Zastąp plik
global $user
.Obsługuj sesje
Krok drugi i trzeci patrz
user_login_submit()
Wszystkie te funkcje opierają się na wywołaniu z formularza. Normalny przepływ polega na tym, że procedury sprawdzania poprawności testują dane wejściowe użytkowników i zwracają identyfikator użytkownika, jeśli sprawdzanie poprawności się powiedzie. Program obsługi przesyłania obsługuje następnie rzeczywiste logowanie użytkownika i wywoływanie haka użytkownika.
źródło
$form_state['value']['name'] = $_POST['name']
itd.$form_state
zmienną. Istnieje wiele fajnych kontroli bezpieczeństwa, które w przeciwnym razie można by stracić i otworzyć witrynę na ataki. Jeśli chodzi o logowanie użytkownika, nie chcesz stracić tego bezpieczeństwa.Jeśli potrzebujesz uzyskać obiekt użytkownika dla konta użytkownika, dla którego znasz nazwę użytkownika i hasło, możesz użyć następującego kodu:
$account
będzie,FALSE
jeśli nie można znaleźć lub załadować obiektu użytkownika.Powinieneś użyć tego kodu, gdy na przykład moduł pobiera nazwę użytkownika i hasło jako dane wejściowe od użytkownika, sprawdza, czy są poprawne, a następnie robi coś z obiektem użytkownika.
Jeśli piszesz moduł, który musi podszyć się pod użytkownika, aby napisać komentarz, lub robisz coś innego, co musi zostać wykonane przez użytkownika, to właśnie robi moduł śledzenia problemów z projektem przy zamykaniu raportu o problemach, który był w naprawiono status na dwa tygodnie (w takim przypadku dodaje się komentarz „Automatycznie zamknięty - problem naprawiony przez 2 tygodnie bez aktywności”, którego wyniki napisał użytkownik „Wiadomości systemowej”), wtedy nie potrzebujesz nazwy użytkownika i hasła. Po prostu ładujesz obiekt użytkownika, dla którego znasz identyfikator użytkownika.
O ile mi wiadomo, nie ma żadnych problemów z bezpieczeństwem w zgłoszonym kodzie.
Możesz ograniczyć liczbę nieudanych prób logowania; lub tymczasowe zablokowanie adresu IP, który próbuje się zalogować bez powodzenia, lub próbuje różnych logowań w krótkim czasie.
źródło
Ten kod naprawdę działa
źródło
Oczyszczona odpowiedź z powyższego. Sprawdzanie użytkownika i hasła to dodatkowa funkcja. Ponadto fałszywy parametr form_state musi być zmienną, która ma być przekazywana przez odwołanie do funkcji, w przeciwnym razie generuje błąd.
Dlatego mamy:
źródło
Użytkownik otrzyma sesję i zostanie również zalogowany na innych stronach:
źródło
Czasami potrzebujemy szybkiego logowania z adresu URL lub zapomniałem hasła administratora. Wystarczy zaimplementować poniżej dwie funkcje, aby zalogować się jako użytkownik 1 w Drupal.
źródło