对单页 Web 应用使用单会话令牌与 Oauth 的缺点



我正在构建一个单页 Web 应用程序,并希望仅通过 REST API 与后端进行交互。 我已经阅读了此页面和其他有关 API 最佳实践的建议。

我想要以下身份验证功能:

  • 每个用户允许多个同时(但未链接(会话(即可以一次从多个设备登录和注销(
  • 当用户从一台设备注销时,该会话不再处于活动状态且无法重复使用,但该用户在其他设备上的其他会话不受影响。
  • 可以打开页面的多个浏览器选项卡,并在它们之间共享会话(无需在每个选项卡上登录(
  • 支持谷歌和脸书身份验证按钮(允许用户注册和验证这些服务(

简单地向每个经过身份验证的会话颁发每个会话令牌(例如 PHP 的会话 ID(,在应用程序的数据库中跟踪这些令牌,并要求每次 API 调用都包含这些令牌是否有意义? 我想它可以存储在cookie中,以便可以从所有浏览器选项卡访问它。 对于每个 API 调用,此令牌将使用有效的活动会话列表在服务器端进行身份验证。 当用户注销时,cookie 将被删除,服务器将删除活动会话 ID(或者在一段时间不使用后被视为无效(。

这里有安全漏洞吗? 是的,我意识到恶意用户可以复制会话密钥并在用户登录时使用它来访问 API,但 JWT 或 OAuth PKCE 令牌不是也是如此吗?

JWT或OAuth如何在此用例中提供优势?(或者他们会吗?

默认行为如下,我认为这接近您的要求:

  • 在选项卡 1 上登录并与 API 交互
  • 打开选项卡 2 上的应用程序,您将自动登录
  • 选项卡
  • 1 和选项卡 2 具有独立的访问令牌
  • 选项卡
  • 1 和选项卡 2 上的注销仍具有有效的访问令牌

您可以在多个选项卡上运行我的在线演示 SPA 以查看其外观。

我更喜欢每个选项卡都有自己独立的 OAuth 会话,这最适合该技术。

OAuth 不会为您提供会话密钥,但您可以单独创建一个 - 如果需要,可以通过 HTML5 本地存储跨选项卡共享它。

例如。我的应用使用与 API 日志关联的会话 ID - 我不会将会话 ID 用于任何安全内容。

最新更新