如何在让用户使用 pyotp 创建新密码之前实现基于 OTP 的验证?

问题描述 投票:0回答:3

我对 Django Rest 框架非常陌生。我正在为我的移动应用程序构建 API。 在忘记密码模块中,我有以下流程

  1. 要求用户输入手机
  2. 检查是否存在
  3. 如果存在->发送OTP
  4. 验证并让用户创建新密码。

但是在这种情况下,我想知道如何处理以下情况。

当一个用户请求 OTP 并等待其验证时,同时另一用户请求 OTP 这时,如何处理这两个用户呢? 我想到了

  1. 创建字典并将用户 id 保存为键,将 otp 保存为views.py中的值以验证特定用户。
  2. 暂时存储 OTP,直到验证为止。

对于这种情况,哪种安全方式以及任何替代方案?

python django django-rest-framework django-views forgot-password
3个回答
0
投票

您应该创建一个如下所示的表格:

===== UserOTP =====
user: foreign-key to user
code: CharField, random generated code here (or token)
create_date: auto-fill created datetime
used_date: nullable datetime field

然后,针对每个密码重置请求,在此表上创建一行,通过短信或电子邮件将生成的代码发送给用户,

然后在另一个端点接收来自用户的代码并检查它(是否过期、之前使用过、属于该用户等),然后继续密码重置过程。


0
投票

有更好的方法来做到这一点,由于 otp 是临时使用的,没有将它们存储在数据库中的用例,我们可以使用

hashlib.blake2s(b'otp', key=b'secretkey').hexdigest()
生成哈希字符串并将其发送给用户,然后接受相同的哈希字符串在 otp 验证请求中并检查从用户共享 otp 生成的哈希字符串的真实性,这是处理 otp 验证的一种方法。

hashlibs blake2s 仅接受字节串,您也可以使用任何其他哈希算法来实现此目的。我也愿意接受想法,如果有更好的方法可以做到这一点,请在评论中更新。

使用会话将是更好的选择,因为它适用于 django 和 djangorestframework。


0
投票

这是一个高级流程,很有帮助。

需要端点

  1. 请求OTP服务
  2. 更新密码

步骤1

点击请求 OTP 服务端点,它会创建一个新的 OTP 并返回它。 (加密模式,根据需要使用安全)。

第2步

  • 点击第二个端点,发送第一个端点的响应以及用户输入的内容 OTP,在更新密码的服务级别检查用户输入的 OTP 并生成 OTP。
  • 如果 OTP 匹配,则更新密码或返回未经授权的密码。
© www.soinside.com 2019 - 2024. All rights reserved.