Flask-Security中基于令牌的密码重置功能的说明

时间:2012-12-16 23:23:13

标签: python flask token password-recovery flask-extensions

有人可以告诉我在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. 指定的地址
  6. 当用户点击该链接时,他们会转到路径(在视图中定义),即reset_password(令牌)。令牌值是此路由的参数。
  7. 路由评估令牌是否有效且未过期。
  8. 如果是这样,此路由会呈现一个表单,要求输入新密码ResetPasswordForm()。
  9. 这是对的吗?

    此外:

    1. 如果以上是正确的,那么令牌包含当前密码的新md5()是否安全?我知道倒车应该是独一无二且成本高昂的,但仍然?
    2. 存储的失效日期在哪里?
    3. 我最担心的是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)函数

1 个答案:

答案 0 :(得分:4)

正在使用itsdangerous模块序列化令牌。如果您在下面详细了解它,您将获得有关如何使用到期时间戳的答案等。

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

函数serializer.dumps()创建一个唯一的序列化字符串,由serializer.loads()调用的get_token_status将返回异常,除非为其提供了确切的序列化值作为参数。

因此,您dumps()然后使用其中的返回值,即可调用loads()。如果不匹配,则您有异常,在这种情况下意味着令牌不良。