没有 UIDB64 的 Django 密码重置流程

Django password reset flow without UIDB64

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

我们目前正在开发 'reset_password' 功能,该功能将遵循熟悉的模式,即单击按钮,收到一封带有密码重置 link 的电子邮件,这将导致 'reset_password' 形式。尽管前端将呈现所有表单,但处理逻辑的是后端。

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

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

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

在幕后 PasswordResetTokenGenerator 正在使用 hmac 库生成 SHA-1 散列(参见 django.contrib.tokens, django.utils.crypto),因此 技术上 对于拥有足够资源的对手来说,它不被认为是安全的,我认为在存在更简单解决方案的日常情况下尝试 "work backwards" 是不切实际的。你是对的。