我正在构建一个单页 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 用于任何安全内容。