有人可以引导我了解Flask-Security的密码重置 token 中发生的情况吗?代码在github上:

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

(目录中可能还有其他部分。)

我对正在发生的事情的理解:

  • 在forgot_password()定义的路由中,用户提交一个表单以重置密码
  • 生成“reset_password_token”。这是由用户ID加上用户当前(存储的加密)密码的md5()组成的吗?
  • 生成指向包含 token 的重置密码地址的链接。
  • 此链接通过电子邮件发送到user.e给定的地址。
  • 当用户单击该链接时,他们会转到一条路线(在 View 中定义),该路线为reset_password( token )。 token 值是此路由的参数。
  • 该路由评估 token 是否有效且未过期。
  • 如果是这样,此路由将呈现一个表单,要求输入新密码ResetPasswordForm()。

  • 那是对的吗?

    还:
  • 如果上述正确,是否可以安全地使 token 包含当前密码的新md5()?我知道逆转应该是独特的且代价高昂的,但是还是吗?
  • 到期日期存储在哪里?

  • 我对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)函数

    最佳答案

    它使用itsdangerous模块来序列化 token 。如果您在下面阅读有关此内容的更多信息,则将获得有关如何使用到期时间戳等的答案。

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

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

    因此,您使用dumps(),然后使用该返回值调用loads()。如果不匹配,则您有异常(exception),在这种情况下,这意味着错误的 token 。

    关于python - Flask-Security中基于 token 的密码重置功能的说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13906490/

    10-12 00:12
    查看更多