使用 API 进行身份验证时,推荐的处理一次性密码的方法是什么?

What is the recommended way to handle one-time-password when using APIs for authentication?

我正在使用 TDD 为 Laravel 中的身份验证系统实现 API。该系统使用一次性密码 (OTP) 方法进行身份验证。第一步,为用户颁发一个 OTP 令牌并存储在 session 中。在第二步中,服务器接收到来自用户的包含 OTP 令牌的请求,并检查接收到的 OTP 令牌是否与存储在 session.

中的相同。

我已经针对用户向服务器发送无效 OTP 令牌的场景编写了测试,但我在测试中无法访问服务器 session,因此我无法比较无效针对会话值的令牌。

有没有比使用会话更好的方法来实现这个?测试中有没有访问服务器session的解决方案?

谢谢大家

数据库

为 OTP

的用户 table 添加一列

第 1 步:

  • 生成 OTP 并发给客户
  • 在数据库中存储 OTP

第 2 步:

  • 服务器收到来自用户的 OTP 请求
  • 与数据库中的值进行比较并从数据库中删除

优点:设置简单

缺点:额外的数据库查询,需要记住删除它,即使在向用户请求发出 OTP 之后从未发出用户请求

缓存

第 1 步:

  • 生成并向用户发出 OTP
  • 在缓存中存储 OTP
Cache::put("otp-{$user->id}", OTP, now()->addMinutes(5));

第 2 步:

  • 服务器收到来自用户的请求

  • 检查缓存中的值

优点:设置简单,OTP 可以自动销毁

缺点:缓存管理成为应用程序的重要领域