Rob*_*uch 58 authentication cookies oauth token oauth-2.0
我的 SPA 应用程序使用以下架构(来源):
这假设我的客户端应用程序知道刷新令牌,因为如果不存在用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。
我的问题:我在哪里存储我的客户端应用程序中的刷新令牌?关于这个话题有很多关于 SO 的问题/答案,但关于刷新令牌,答案尚不清楚。
访问令牌和刷新令牌不应存储在本地/会话存储中,因为它们不是任何敏感数据的地方。因此,我会将访问令牌存储在httpOnlycookie 中(即使有 CSRF),无论如何,我对资源服务器的大多数请求都需要它。
但是刷新令牌呢?我不能将它存储在 cookie 中,因为 (1) 它会随着每个请求发送到我的资源服务器,这也使它容易受到 CSRF 的攻击和 (2) 它会发送暴露访问/刷新令牌与相同的攻击向量.
我能想到的解决方案有以下三种:
1) 将刷新令牌存储在内存中的 JavaScript 变量中,这有两个缺点:
尤其是后一个缺点会导致糟糕的用户体验。
2) 将访问令牌存储在会话存储中,并通过Bearer access_token授权标头将其发送到我的资源服务器。然后我可以使用httpOnlycookie 作为刷新令牌。这有一个我能想到的缺点:
3) 将两个令牌保存在httpOnlycookie 中,这具有上述缺点,即两个令牌都暴露于相同的攻击向量。
也许除了我提到的缺点之外还有另一种或更多的方式(请告诉我),但最终一切都归结为我将刷新令牌保存在客户端的什么位置?它是httpOnlycookie 还是内存中的 JS 变量?如果是前者,那么我应该把我的访问令牌放在哪里?
很高兴从熟悉该主题的人那里获得有关如何以最佳方式执行此操作的任何线索。
Vla*_*ykh 37
您可以将加密的令牌安全地存储在HttpOnlycookie 中。
https://medium.com/@sadnub/simple-and-secure-api-authentication-for-spas-e46bcea592ad
如果您担心长寿命的刷新令牌。您可以跳过存储它而根本不使用它。只需将访问令牌保留在内存中,并在访问令牌过期时进行静默登录。
不要使用
Implicit流,因为它已经过时了。
SPA 最安全的身份验证方式是使用 PKCE 的授权代码。
一般来说,使用基于oidc-client 的现有库比自己构建更好。
小智 29
您可以将令牌(访问和刷新)存储为 cookie。但是刷新令牌必须有特殊的路径(例如/refresh)。因此刷新令牌将仅针对对 /refresh url 的请求发送,而不是针对每个请求(如访问令牌)发送。
将访问令牌存储在会话存储中,并通过承载
access_token授权标头将其发送到我的资源服务器。然后我可以使用 httpOnly cookie 作为刷新令牌。我能想到这有一个缺点:a) 每次向资源服务器发出请求时,刷新令牌都会暴露给 CSRF。
您可以正确设置,以便仅接受来自授权服务器的CORS policy请求。/refresh_token
如果客户端和服务器由同一台计算机提供服务,则可以在 中将标志设置sameSite为 trueCookie并包含anti-CSRF令牌。
如果您的身份验证提供程序实现了刷新令牌轮换,您可以将它们存储在本地存储中。
但这意味着每次客户端刷新 JWT 时,您的 Auth 提供程序都应返回一个新的刷新令牌。如果尝试第二次使用一个刷新令牌,它还应该有一种使后代刷新令牌无效的方法。
https://auth0.com/docs/tokens/refresh-tokens/refresh-token-rotation
| 归档时间: |
|
| 查看次数: |
49316 次 |
| 最近记录: |