2012-12-16 2 views
5

フラスコセキュリティのパスワードリセットトークンで何が起こっているのか誰かが私を歩くことができますか?Flask-Securityのトークンベースのパスワードリセット機能の説明

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

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

の私の理解で何が起こっている:forgot_passwordによって定義されたルートで

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

これは間違いありませんか?また

  1. 上記の場合には、それはトークンが現在のパスワードの新しいMD5()を含有させることは安全である、正しいでしょうか?私はそれが独特でなければならないことを知って、逆にコストがかかるが、それでも?
  2. 有効期限はどこに保存されていますか?

私が最も具体的にはトークンをシリアライズするitsdangerousモジュールを使用しているgenerate_password_reset機能reset_password_token_status(token)

答えて

4

内部

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

get_token_status(token, 'reset', 'RESET_PASSWORD')機能によって混乱しています。あなたは以下それについての詳細を読む場合は、有効期限のタイムスタンプがなどに使用される方法についてのあなたの答えを持っています

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

機能serializer.dumps()がない限り、例外を返しますget_token_statusによって呼び出されたユニークなシリアル化された文字列とserializer.loads()を作成します正確なシリアライズされた値がパラメータとして渡されます。

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

関連する問題