添加 2FA 到 Laravel 基于护照 API

Adding 2FA to Laravel Passport based API

令我感到惊讶的是,我没有找到任何关于使用护照 laravel 双因素身份验证的实际示例或最佳实践。

因为我想在用户登录 API 并收到他的访问令牌时实施此步骤,所以我不确定如何以安全的方式进行处理。

当前流程如下:

  1. 用户看到前端登录页面(vue SPA)。
  2. 用户输入 usernamepassword 并点击提交。
  3. SPA 向 API 发送请求。
  4. API 使用访问令牌进行响应,或者如果出现问题则给出未验证错误。
  5. SPA 可以使用访问令牌从 API 请求其他资源,直到令牌失效。

因为我想让用户单独激活或停用 2FA(因为有些客户可能不想使用它,有些客户会),我会在我的 users [=48= 中添加一个新列] 存储是否启用 2FA。

但是接下来怎么继续呢?如果用户像以前一样定期使用 usernamepassword 进行身份验证,那么 API 知道他是否“需要”第二个身份验证步骤和 returns 一个标志,以便前端知道显示另一个查看以输入令牌?

感谢任何输入:)

快速总结我对这个问题的解决方案:我实现了一项服务 class 来处理 OTP 生成和用户密码生成。 OTP 与指定标准兼容(我认为是 RFC 6238、TOTP)

如果用户为 2FA 初始化,将生成一个秘密并将其存储到数据库中。用户必须使用通过他选择的验证器应用程序(如 Google Authenticator)显示的第一个代码来验证它。 所有 QR-Code 生成等都是由我的前端完成的,它与 API 代码分开。

因为我使用 Laravel Passport 进行 API 身份验证,所以我扩展了 TokenGuard class 以处理额外的 2FA 令牌 - 如果为用户。否则这将被跳过。

此 2FA 令牌是在用户使用他的 username/password 组合登录后,在每次成功的代码挑战中唯一生成的,并发送到前端,也将在所有即将到来的请求中使用(作为单独的 header).

这对我来说效果很好,最后我不需要实现任何第三方库!

@ml59 感谢您的意见,帮助我四处走动!