如何使用 OTP 进行身份验证

How to use OTP for authentification

我有一个 Android 应用程序,它使用 OTP(一次性密码)第一次使用 Phone 号码 对用户进行身份验证。

  1. 我想在每次打开应用时自动验证用户。
  2. 而且我还想为丢失手机 phone 或更改 phone 号码的用户提供解决方案。

如何在后端执行此操作?我是否存储 phone 号码?我会生成令牌吗?

答案是肯定的。您需要生成并存储用户的唯一令牌,并将 phone 号码与其一起存储到数据库中。您还需要将该唯一令牌也存储到移动设备中。

假设当用户丢失手机 phone 那么我们可以很容易地恢复我们的旧 phone 号码(通常,在印度屏蔽 sim 卡后是可能的)

因此,请考虑以下情况:

1).用户丢失手机 phone

在这种情况下,按照我的假设,手机号码不会改变。因此,当用户尝试使用相同的手机号码登录一段时间/几天后,您需要将唯一生成的令牌存储到用户的新移动设备中。

2).用户更改 phone 号码

在这种情况下,我们的独特令牌出现了。使用 android,您可以获取 SIM 卡和该 SIM 卡的 phone 号码。读取新的 phone 号码后,将 OTP 发送到该号码。如果验证成功,那么在后端你需要传递 2 个参数,一个已经存储在移动设备中的唯一令牌和一个新的 phone 号码。您需要检查该唯一令牌的数据库,并简单地更新该令牌的新 phone 号码。

您可以创建一个单独的 collection/table 用于在您的数据库中存储 token/otp。为用户使用唯一生成的 ID,并使用该 ID 引用其他集合。 由于您计划允许用户更改手机号码,因此使用手机号码来识别用户并不是一个好的选择。

您的申请中有2个案例:

  1. 当数字保持不变时:生成一个随机数并将其与唯一用户 ID 一起存储在数据库中,并删除给定 user id 之前的所有 tokens/otp这样旧的 otps 就不能再次使用,还要添加一个时间戳并用你的 android 应用程序检查它,并拒绝在它们生成 x 分钟后输入的 otps。您还可以在后端使用 CRON 作业在一定时间后删除 otps,但只需比较 android 应用程序上的时间就足够了。

  2. 当您更改号码时:使用上述方法生成 otp,为了增加安全性,在您的数据库中的用户 table/object 中添加一个字段以标记是否要更改号码或不是。当您收到 otp 时,您可以使用用户的唯一 ID 进行查找并在标志设置为 true 时更改号码,并在更改号码后将标志设置为 false 否则您可能会抛出错误,因为该号码不应该是使用生成的 otp 更改。确保在调用普通 otp API 时将标志设置为 false。

由于 OTP 代表一次性密码,您只需要生成一个 随机 数字或具有特定长度(至少 4 位数字)的有效字符(令牌)的组合然后将请求用户的 it 创建时间 存储在数据库中以供评估。

这对于在激活 OTP 机制之前存储有效的电子邮件地址是必要的,因为用户可能会丢失他的 phone 或更改 phone 号码和应该有一个后备解决方案,以便设置一个新的解决方案。电子邮件在这段时间内不会更改或打扰,因为它有自己的恢复机制。

这样,不需要在每次用户请求时生成全球唯一的OTP。 OTP 是用户特定的,自其生成时间起在短时间内有效。您可以实施其他安全机制,例如最大允许故障数或将 OTP 长度增加到 8 位(或与有效字符组合,但尽可能短)以根据您的项目敏感性来增强它。

这是一个深思熟虑的决定,添加了另一个 recovery/security 选项,例如使用 安全问题 ,这在特殊情况下非常有用。现在让我们更详细地回答您的问题:

How can I do this in Back-end ?

您必须存储 任何 值(OTP 的创建时间也是),然后根据它们进行验证。

Do I store the phone number ?

是的,您必须为每个用户存储它。根据您的首选设计,您也可以存储一些替代 phone 号码。这样,每个 phone 号码都应该以安全的方式添加,也许是通过验证第一个(主要)phone 号码。

Do I generate a token ?

可能由数字或有效字符组成的安全令牌需要生成保存发送给目标用户,为了有一个OTP验证机制。