2012-12-16 13 views
5

Kann mir jemand erklären, was im Passwort-Reset-Token von Flasch-Security passiert? Der Code ist hier auf GitHub:Erläuterung der tokenbasierten Funktion zum Zurücksetzen von Kennwörtern in Flask-Security

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

(Es kann ein Verzeichnis andere Teile sein.)

Mein Verständnis von dem, was passiert:

  1. In der Route durch FORGOT_PASSWORD definiert () Benutzer sendet ein Formular zum Zurücksetzen des Passworts
  2. Ein "reset_password_token" wird generiert. Dies besteht aus der ID des Benutzers + einem md5() des aktuellen (gespeicherten-verschlüsselten) Passworts des Benutzers?
  3. Es wird eine Verknüpfung zu einer Adresse für das Zurücksetzen des Kennworts mit dem Token generiert.
  4. Dieser Link wird an die von user.email angegebene Adresse gesendet.
  5. Wenn der Benutzer auf diesen Link klickt, wird eine Route (in Sichten definiert) angezeigt, bei der es sich um reset_password (Token) handelt. Der Token-Wert ist ein Argument für diese Route.
  6. Die Route bewertet, ob das Token gültig und nicht abgelaufen ist.
  7. Wenn ja, rendert diese Route ein Formular, das nach einem neuen Kennwort fragt, ResetPasswordForm().

Ist das korrekt?

auch:

  1. Wenn oben richtig ist, ist es sicher, die Token einen neuen md5 enthalten machen() des aktuellen Passwort? Ich weiß, es sollte einzigartig und teuer sein, umzukehren, aber immer noch?
  2. Wo ist das Ablaufdatum gespeichert?

Ich bin ganz speziell verwirrt durch die generate_password_reset Funktion

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

und der

get_token_status(token, 'reset', 'RESET_PASSWORD') Funktion innerhalb reset_password_token_status(token)

Antwort

4

Es wird mit dem itsdangerous Modul das Token serialisiert. Wenn Sie mehr darüber lesen Sie unten, haben Sie Ihre Antworten darauf, wie Ablauf-Zeitstempel verwendet wird usw.

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

Die Funktion serializer.dumps() schafft eine einzigartige serialisierten String und serializer.loads(), die von get_token_status aufgerufen wird, Ausnahmen, es sei denn die Rückkehr Genauer serialisierter Wert wird ihm als Parameter bereitgestellt.

Sie also dumps() und dann mit dem Rückgabewert von diesem, rufen Sie loads(). Wenn nicht übereinstimmt, haben Sie eine Ausnahme, was in diesem Fall ein schlechtes Token bedeutet.