OAuth2 PKCE 流程 - 从单页应用程序安全地使用访问令牌

魔杖制造者

我有一个使用 angular-auth-oidc-client 与 KeyCloak 服务器集成的 Angular 应用程序

我使用 PKCE 流程并从 Keycloak 服务器(OIDC 提供程序)获取 id 令牌、访问令牌和刷新令牌。我不需要刷新令牌,但 Keycloak 服务器似乎总是返回它,即使范围不使用“offline_access”。

默认情况下,OAuth 库将所有​​令牌存储在会话存储中。我编写了一个自定义存储来忽略刷新令牌,而不是将它们存储在会话存储中。

我在互联网上读到会话存储不是完全安全的存储,存储的 XSS 攻击可以检索令牌。然而,Stored XSS 的缓解措施是使用标准框架,如我正在使用的 Angular。

假设存储型 XSS 漏洞几乎是不可能的情况,上述解决方案是否安全,其中我使用会话存储中的访问令牌来调用我的后端 API。

加里·阿切尔

SPA 的当前最佳实践

使用访问令牌时有更多的攻击向量和未知数,当前的最佳实践是使用 aBackend for Frontend以便HTTP Only SameSite=strict在浏览器中只使用 cookie。

也可以通过实用程序 API 发出 cookie,以避免影响您的整体 SPA 架构。在 Curity,我们的SPA 最佳实践对此有更多信息,尽管这是一个棘手的流程。

还有一个指向更深入讨论威胁的白皮书的链接。在某种程度上,您选择的解决方案将取决于您的数据的价值。对于中高安全性数据解决方案,目前首选仅 cookie 解决方案。

多个 SPA 和单点登录

SSO 是身份提供者会话 cookie 的属性,也是应用程序是否使用 OpenID Connect 参数,例如prompt=loginmax_age因此,多个 SPA 仍然可以使用 BFF 解决方案实现 SSO,每个应用程序都被发行不同的令牌。

多个 SPA 在调用 API 时必须使用隔离的 cookie,因此需要使用不同的 API 路由。这增加了复杂性,所以我理解这些担忧。我也喜欢oidc-client等较旧的纯 Javascript 解决方案的简单性。

攻击向量

其中包括通过 fetch API 的猴子补丁捕获飞行中的令牌、攻击者旋转获取令牌的隐藏 iframe 或浏览器扩展的拦截操作。

如果令牌以某种方式被拦截,它们可能会被发送出浏览器。内容安全策略应该降低这种风险,但用户或插件可以禁用它们。视频讨论了威胁并且非常有趣。

洞察力

这是最大的因素之一——如果您必须向客户、利益相关者或 PEN 测试人员解释您的安全性。如果您遵循 BCP,这些对话会更容易。否则,在某些领域,您可能会面临棘手的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python 桌面应用程序 - 在 OAuth2 PKCE 流程中关闭浏览器

如何为React单页应用程序使用PKCE实现OAuth2授权代码授予?

OAuth2:使用哪个流程?

如何使用 PKCE 授权流程注销?

移动应用程序的OAuth2流程

在没有 PKCE 的情况下使用 OAuth2 授权码是什么情况

了解OAuth2流程

了解OAuth2的流程

授权流程应针对Web应用程序同时使用密钥和PKCE吗

如何通过curl获取GitHub OAuth2状态代码以模拟Web应用程序流程?

带有后端 Web 应用程序调用 Graph API 的本机应用程序的 Oauth2 流程

.NET Oauth2 身份验证流程(如果令牌已存在)

在没有OAuth2用户流程的情况下授权python脚本访问GData API

使用PKCE登录Discord OAuth的过程

找出HPC命令行实用程序的(Azure)OAuth2授权流程

如何使用 Keycloak 和 PKCE 流程实现 React SPA 身份验证?

您能否解释 PKCE 的 oauth2 授权代码流如何工作以及为什么它为浏览器客户端提供更多安全性?

Spring OAuth2服务器无法使用资源所有者凭证(密码)授予流程刷新令牌

具有单页面应用程序刷新访问令牌的Oauth2隐式流

我应该为PWA +服务器端应用程序使用哪种OAuth2身份验证流程

Oauth2隐式授权流程和第三方Cookie中的刷新令牌

使用OAuth2隐式流程(IdentityServer4),用户是否必须在每次访问令牌到期时都重新输入密码?

如何安全地存储Discord(OAuth2)用户的访问令牌?

OAuth2访问令牌

OAuth2隐式流程-IFrame刷新身份

了解OAuth2客户端凭据流程

Chrome自定义标签Oauth2流程

如何实现Spring OAuth2自定义流程?

Cognito '/oauth2/token' 端点未返回 'id_token' 以获得 PKCE 的授权代码授予