如何使用 OTP 进行身份验证
How to use OTP for authentification
我有一个 Android 应用程序,它使用 OTP(一次性密码)第一次使用 Phone 号码 对用户进行身份验证。
- 我想在每次打开应用时自动验证用户。
- 而且我还想为丢失手机 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个案例:
当数字保持不变时:生成一个随机数并将其与唯一用户 ID 一起存储在数据库中,并删除给定 user id
之前的所有 tokens/otp这样旧的 otps 就不能再次使用,还要添加一个时间戳并用你的 android 应用程序检查它,并拒绝在它们生成 x 分钟后输入的 otps。您还可以在后端使用 CRON 作业在一定时间后删除 otps,但只需比较 android 应用程序上的时间就足够了。
当您更改号码时:使用上述方法生成 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验证机制。
我有一个 Android 应用程序,它使用 OTP(一次性密码)第一次使用 Phone 号码 对用户进行身份验证。
- 我想在每次打开应用时自动验证用户。
- 而且我还想为丢失手机 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个案例:
当数字保持不变时:生成一个随机数并将其与唯一用户 ID 一起存储在数据库中,并删除给定
user id
之前的所有 tokens/otp这样旧的 otps 就不能再次使用,还要添加一个时间戳并用你的 android 应用程序检查它,并拒绝在它们生成 x 分钟后输入的 otps。您还可以在后端使用 CRON 作业在一定时间后删除 otps,但只需比较 android 应用程序上的时间就足够了。当您更改号码时:使用上述方法生成 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验证机制。