2012-12-16 21 views
5

Czy ktoś może opowiedzieć mi o tym, co dzieje się w tokenie resetowania hasła w pakiecie? Kod jest tutaj na github:Wyjaśnienie funkcji resetowania hasła opartej na tokenie w Flask-Security

https://github.com/mattupstate/flask-security/blob/develop/flask_security/recoverable.py

(Nie mogą być inne części up katalogiem.)

Moje zrozumienie tego, co się dzieje:

  1. W trasie wyznaczonej przez forgot_password () użytkownik przesyła formularz do zresetowania hasła
  2. Generowany jest "reset_password_token". Składa się z identyfikatora użytkownika + md5() aktualnego (przechowywanego-zaszyfrowanego) hasła użytkownika?
  3. Link jest generowany w celu zresetowania adresu hasła zawierającego token.
  4. Ten link jest wysyłany pocztą elektroniczną na adres podany przez użytkownika.email
  5. Po kliknięciu tego łącza użytkownik przechodzi do trasy (zdefiniowanej w widokach), która jest reset_password (token). Wartość tokena jest argumentem dla tej trasy.
  6. Trasa sprawdza, czy token jest ważny i czy nie wygasł.
  7. Jeśli tak, ta trasa renderuje formularz z prośbą o nowe hasło ResetPasswordForm().

Czy to prawda?

również:

  1. Jeśli powyższe jest prawidłowe, czy jest to bezpieczne, aby token zawierać nową md5() bieżącego hasła? Wiem, że odwrócenie powinno być unikalne i kosztowne, ale nadal?
  2. Gdzie jest przechowywana data ważności?

jestem najbardziej specyficznie mylone przez funkcję generate_password_reset

data = [str(user.id), md5(user.password)] return _security.reset_serializer.dumps(data)

i funkcji

get_token_status(token, 'reset', 'RESET_PASSWORD') wewnątrz reset_password_token_status(token)

Odpowiedz

4

To jest za pomocą modułu itsdangerous do serializacji token. Jeśli przeczytasz więcej na ten temat poniżej, będziesz miał swoje odpowiedzi dotyczące ważności datownik służy itp

http://packages.python.org/itsdangerous/

Funkcja serializer.dumps() tworzy unikalny ciąg odcinkach i serializer.loads() który jest nazywany przez get_token_status powróci wyjątków, chyba że dokładna wartość serializowana jest podawana jako parametr.

Tak więc dumps(), a następnie za pomocą zwracanej wartości z tego, dzwonisz loads(). Jeśli nie pasuje, masz wyjątek, który w tym przypadku oznacza zły token.

Powiązane problemy