在 cookie 中存储访问令牌和刷新令牌

Posted

技术标签:

【中文标题】在 cookie 中存储访问令牌和刷新令牌【英文标题】:Store Access Token and Refresh Token in cookies 【发布时间】:2021-10-07 17:38:35 【问题描述】:

我知道我可以使用 OAuth、OpenID 或 SAML。但是,鉴于我的应用程序在同一个子域下运行并且我已正确配置 CORS,我想知道是否可以采用更简单的路径。

https://admin.mycompany.com/app1 https://admin.mycompany.com/app2 https://admin.mycompany.com/app3 https://admin.mycompany.com/login(单点登录

这些应用程序要么内置在 React 中,要么内置于带有 Antiforgery Token 的服务器端 Razor 页面。 这两种类型的应用,存储可以吗?

Access Token 可从 javascript 访问的 Cookie(短期)(JWT)( 刷新令牌在 Cookie 中无法从 javascript (HttpOnly) 访问(长期存在)

【问题讨论】:

【参考方案1】:

以下内容符合 OAuth 模式。希望这些指针能让您前进一点,尽管我不知道您的应用程序的数据敏感性等因素。

刷新令牌

如果您将其存储在 cookie 中,请使用以下属性:

SameSite=strict 仅 HTTP 安全 域=admin.mycompany.com 路径:/login/refresh

访问令牌

如果需要,请执行相同操作并使用不同的路径。避免使用非 HTTP Only cookie,因为浏览器中的恶意代码可以通过读取 document.cookie 来获取令牌。

另一种选择是发送 RT cookie 以获取浏览器的访问令牌并将其存储在内存中 - 请参阅 BFF TMI。

但请注意,不鼓励浏览器中的访问令牌,因为它们具有更多风险并需要更多缓解措施 - 请参阅 this video。

加密

使用 AES256 和只有服务器端知道的秘密加密包含令牌的 cookie。

范围界定

理想情况下,每个应用都应该重定向并获得自己的独立令牌,否则 App1 用户可能会拥有 App3 权限 - 请确保您的后端授权能够处理此问题。

【讨论】:

这两种应用如何实现单点登录呢? React 应用程序使用访问令牌进行客户端 API 调用。 Razor 应用程序也使用访问令牌进行服务器端 API 调用。因此,我需要将访问令牌存储为非 HttpOnly,因此它是可访问的服务器和客户端。 处理这个问题的常用方法是提供一个 React 应用程序可以使用的 GET /token 端点。将包含访问令牌的仅 HTTP cookie 从浏览器发送到服务器,然后在 JSON 响应中接收 AT。 React 应用程序可以将令牌存储在内存闭包中,而不是全局可用。当然还要确保您的应用没有任何允许端点被滥用的 XSS 漏洞。 但是用户需要来到/login/refresh页面,浏览器可以自动携带相应的cookie,这是否意味着重定向达到目的 cookie 相关的调用都可以通过 Ajax 调用完成,不会影响用户。看看this code example。它的 OAuthClient 类和从 repo 的 README.md 文件链接到的文档。

以上是关于在 cookie 中存储访问令牌和刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

存储位置 - OAuth 2.0 中的访问令牌和刷新令牌

JWT 刷新和访问令牌

使用访问令牌和刷新令牌保持身份验证

IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储

在 JavaScript 中存储刷新令牌,获取新的访问令牌

访问令牌和刷新令牌困境 - JWT