【问题标题】:What is the recommended way to handle one-time-password when using APIs for authentication?使用 API 进行身份验证时处理一次性密码的推荐方法是什么?
【发布时间】:2021-03-09 11:33:58
【问题描述】:
我正在使用 TDD 为 Laravel 中的身份验证系统实现 API。该系统使用一次性密码 (OTP) 方法进行身份验证。第一步,为用户颁发 OTP 令牌并存储在 session 中。第二步,服务器从用户接收一个包含 OTP 令牌的请求,并检查接收到的 OTP 令牌是否与存储在 session 中的相同。
我为用户向服务器发送无效 OTP 令牌的场景编写了一个测试,但我在测试中无权访问服务器 session,因此我无法将无效令牌与会话进行比较价值。
有没有比使用会话更好的方法来实现这一点?测试中有没有办法访问服务器session?
谢谢大家。
【问题讨论】:
标签:
laravel
api
session
tdd
one-time-password
【解决方案1】:
数据库
为 OTP 的用户表添加一列
第 1 步:
- 生成 OTP 并发送给客户
- 在数据库中存储 OTP
第 2 步:
- 服务器通过 OTP 接收来自用户的请求
- 与数据库中的值进行比较并从数据库中删除
优点:设置简单
缺点:额外的数据库查询,需要记住删除它,即使在向用户发出 OTP 后用户的请求从未发出
缓存
第 1 步:
Cache::put("otp-{$user->id}", OTP, now()->addMinutes(5));
第 2 步:
优点:设置简单,OTP 可以自动销毁
缺点:缓存管理成为应用程序的重要领域