在 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 中存储访问令牌和刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章