【问题标题】:Django password reset flow without UIDB64没有 UIDB64 的 Django 密码重置流程
【发布时间】:2019-11-12 17:57:18
【问题描述】:

我们公司的一个团队正在开发一款新应用。这个应用程序将包含一个 javascript 前端和一个 Django 后端(使用 graphql 在两者之间进行通信)。我正在开发 Django 后端,我是该项目的唯一后端开发人员。

我们目前正在开发“reset_password”功能,该功能将遵循熟悉的模式,即单击按钮,接收带有密码重置链接的电子邮件,该链接将引导至“reset_password”表单。尽管前端将呈现所有表单,但处理逻辑的是后端。

我编写的代码大量借鉴了默认的django.contrib.auth 视图/表单。电子邮件中的链接包含一个令牌(使用PasswordResetTokenGenerator().make_token(user) 调用创建)和一个uid(使用urlsafe_base64_encode(force_bytes(user.pk)) 调用创建)。

但是,我的前端同事问我是否可以放弃使用uid(可用于识别用户的任何其他字段),而是从令牌“向后工作”到用户。现在我知道令牌是由用户生成的(作为创建令牌调用中的参数提供:PasswordResetTokenGenerator().make_token(user))但到目前为止,似乎不可能使用令牌来检索用于创建它的用户. (我也想到,这样做会带来安全风险)

所以我的问题如下:我是否正确地认为使用令牌来获取用户是不可能的(或者至少是不可取的)?

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    在后台 PasswordResetTokenGenerator 正在使用 hmac 库来生成 SHA-1 哈希(参见 django.contrib.tokensdjango.utils.crypto),因此虽然技术上不被认为是安全的对于拥有足够资源的对手,我认为在存在更简单解决方案的日常情况下尝试“倒退”是不切实际的。你是对的。

    【讨论】:

      猜你喜欢
      • 2019-01-01
      • 2014-05-02
      • 2018-12-03
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2011-08-16
      • 2018-07-07
      • 2018-10-29
      相关资源
      最近更新 更多