【问题标题】:Downsides of using single-session tokens vs Oauth for single page web app在单页 Web 应用程序中使用单会话令牌与 Oauth 的缺点
【发布时间】:2020-04-09 13:45:02
【问题描述】:

我正在构建一个单页网络应用程序,并且希望仅通过 REST API 与后端交互。我已经阅读了this page 和其他人关于 API 最佳实践的建议。

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

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

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

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

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

【问题讨论】:

标签: authentication session oauth-2.0 jwt


【解决方案1】:

默认行为如下,和我想的你要求的差不多:

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

您可以在多个选项卡上运行我的Online Demo SPA 以查看它的外观。

我的偏好是每个选项卡都有自己独立的 OAuth 会话,这最适合技术。

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

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 2017-04-25
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多