6

誰かがflask-securityのパスワードリセットトークンで何が起こっているのかを教えてもらえますか?コードはここgithubにあります:

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

(ディレクトリには他の部分があるかもしれません。)

何が起こっているのかについての私の理解:

  1. forgot_password()で定義されたルートで、ユーザーはパスワードをリセットするためのフォームを送信します
  2. 「reset_password_token」が生成されます。これは、ユーザーのID +ユーザーの現在の(保存された暗号化された)パスワードのmd5()で構成されますか?
  3. トークンを含むリセットパスワードアドレスへのリンクが生成されます。
  4. このリンクは、user.emailによって指定されたアドレスに電子メールで送信されます
  5. ユーザーがそのリンクをクリックすると、reset_password(token)であるルート(ビューで定義)に移動します。トークン値は、このルートへの引数です。
  6. ルートは、トークンが有効であり、有効期限が切れていないかどうかを評価します。
  7. その場合、このルートは、新しいパスワードResetPasswordForm()を要求するフォームをレンダリングします。

あれは正しいですか?

また:

  1. 上記が正しければ、トークンに現在のパスワードの新しいmd5()を含めるのは安全ですか?逆にするのはユニークで費用がかかるはずですが、それでも?
  2. 賞味期限はどこに保存されますか?

私はgenerate_password_reset関数によって最も具体的に混乱しています

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

そしてその

get_token_status(token, 'reset', 'RESET_PASSWORD')内部で機能するreset_password_token_status(token)

4

1 に答える 1

5

モジュールを使用しitsdangerousてトークンをシリアル化します。以下で詳細を読むと、有効期限のタイムスタンプの使用方法などに関する回答が得られます。

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

この関数serializer.dumps()は、一意のシリアル化された文字列を作成します。この文字列serializer.loads()が呼び出されるget_token_statusと、正確なシリアル化された値がパラメーターとして指定されていない限り、例外が返されます。

したがってdumps()、あなたはそれからの戻り値を使用して、を呼び出しますloads()。一致しない場合は例外があり、この場合は不正なトークンを意味します。

于 2012-12-17T18:16:30.670 に答える