【发布时间】: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 将如何在此用例中提供优势? (或者他们会?)
【问题讨论】:
-
为什么不直接使用会话 cookie(没有您的自定义令牌)?看看OAuth 2.0 for Browser-Based Apps RFC。
标签: authentication session oauth-2.0 jwt