【问题标题】:Explanation of the token-based password-reset functionality in Flask-SecurityFlask-Security 中基于令牌的密码重置功能说明
【发布时间】:2012-12-04 02:18:27
【问题描述】:

有人可以告诉我烧瓶安全的密码重置令牌中发生了什么吗?代码在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)

【问题讨论】:

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


    【解决方案1】:

    它使用itsdangerous 模块来序列化令牌。如果您在下面阅读更多相关信息,您将获得有关如何使用过期时间戳等的答案。

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

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

    所以你 dumps() 然后使用返回值调用 loads()。如果不匹配,则您有异常,在这种情况下意味着错误的令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2018-01-14
      • 2019-06-04
      • 2014-04-04
      相关资源
      最近更新 更多