Authentication 单页web应用程序使用单会话令牌与Oauth的缺点

Authentication 单页web应用程序使用单会话令牌与Oauth的缺点,authentication,session,oauth-2.0,jwt,Authentication,Session,Oauth 2.0,Jwt,我正在构建一个单页web应用程序,只想通过RESTAPI与后端交互。我已经阅读了和其他人关于API最佳实践的建议 我需要以下身份验证功能: 允许每个用户同时进行多个(但不链接)会话(即可以同时从多个设备登录和注销) 当用户从一个设备注销时,该会话将不再处于活动状态,并且无法重新使用,但用户在其他设备上的其他会话不会受到影响 可以在页面上打开多个浏览器选项卡,并且会话在它们之间共享(无需在每个选项卡上登录) 支持Google和facebook身份验证按钮(允许用户注册并使用这些服务进行身份验证)

我正在构建一个单页web应用程序,只想通过RESTAPI与后端交互。我已经阅读了和其他人关于API最佳实践的建议

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

  • 允许每个用户同时进行多个(但不链接)会话(即可以同时从多个设备登录和注销)
  • 当用户从一个设备注销时,该会话将不再处于活动状态,并且无法重新使用,但用户在其他设备上的其他会话不会受到影响
  • 可以在页面上打开多个浏览器选项卡,并且会话在它们之间共享(无需在每个选项卡上登录)
  • 支持Google和facebook身份验证按钮(允许用户注册并使用这些服务进行身份验证)
简单地向每个经过身份验证的会话(比如PHP的会话ID)发出每个会话令牌,在应用程序的数据库中跟踪这些令牌,并要求每个API调用都包含这些令牌,这有意义吗?我想它可以存储在cookie中,这样就可以从所有浏览器选项卡访问它。 对于每个API调用,该令牌将通过服务器端的有效活动会话列表进行身份验证。 当用户注销时,cookie将被删除,服务器将删除活动会话ID(或者在一段时间不使用后,它将被视为无效)

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


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

默认行为如下所示,我认为这与您的要求非常接近:

  • 登录选项卡1并与API交互
  • 打开选项卡2上的应用程序,您将自动登录
  • 表1和表2具有独立的访问令牌
  • 在选项卡1和选项卡2上注销仍具有有效的访问令牌
您可以在多个选项卡上运行my,以查看其外观

我倾向于每个选项卡都有自己的独立OAuth会话,这最适合该技术

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


例如,我的应用程序使用与API日志相关的会话id-我不使用会话id进行任何安全操作。

为什么不直接使用会话cookie(不使用自定义令牌)?请看下面的图片。