如何安全地将 Open ID Connect 令牌转换为 Cookie

How to Securely Convert Open ID Connect Tokens to Cookies

我们有一个客户端应用程序,我们希望通过 OIDC 启用 SSO。客户端应用程序是一个具有专用后端 API 的 SPA。目前,身份验证是通过 cookie 实现的,授权是根据 Auth_Cookie 的用户在后端强制执行的。 OIDC 身份验证完成后,我们希望继续利用这些现有的基于本地 cookie 的 code/logic,这也避免了使用 SPA 存储令牌的需要。

完成授权代码 PKCE 流程后,前端 SPA 会直接从 OP 的 /token 端点收到 ID_Token 和 Access_Token。要从 ID/Access_Token 到 Auth_Cookie,一种方法可以是:

  1. 前端 SPA 调用后端 API 进行身份验证(例如 /authenticate),传递 Access_Token
  2. 后端验证 Access_Token 并发出 Auth_Cookie

因为 ID_Token 仅适用于客户端应用程序(在此上下文中是前端 SPA),我的假设是它在此序列中没有任何作用(尽管从逻辑上讲,您会认为对后端 API 的 /authenticate 端点的调用应提供类似凭据的内容,例如 ID_Token).

上述方法是否有意义,是否有任何安全性 issues/concerns?是否有 alternative/better 方法将前端 OIDC 身份验证上下文实质上转换为 cookie?

任何见解或帮助将不胜感激。谢谢。

我认为让您的后端进程进行身份验证重定向会更容易 - 使其成为 OAuth2 客户端而不是您的 SPA。您的 SPA 不需要令牌,也无需将访问令牌传输到后端。将接收授权代码的后端处理程序将获取令牌并创建授权 cookie(具有所有安全参数)。

如果您需要将 SPA 保留为 OAuth2 客户端,那么您提出的解决方案可能不错。

感谢 Sherman 的有趣讨论 - 你让我意识到我做的事情并不正确,所以我更新了一些东西。

选项 1 - Cookie

这很有意义,尤其是在您还不需要跨域功能的情况下。完全承诺不使用 cookie 可能也需要大量工作。

选项 2 - 无 COOKIELESS,令牌存储在内存中

可以构建一个完全无 cookie 的 SPA,并且仍然可以处理可用性问题,例如用户刷新页面而无需重新登录。它在正确支持 prompt=none 参数的授权服务器上具有先决条件。

选项 3 - 无 COOKIELESS,令牌存储在 HTML5 会话存储

正如我们所讨论的,许多人认为这并不安全,因此最好尽可能避免。如果您的授权服务器不支持 prompt=none.

,您可以考虑使用它