由于PKCE现在是隐式流程上推荐的授权方法,我正在寻找处理代码验证器的最佳实践和如何完成的建议。在高级PKCE授权流程中包括:
1.在客户端生成code_verifier
1.从(1)生成code_challenge
1.使用code_challenge
点击/authorise
,重定向到选择idp,回调中有一个code
1.使用(3)中的code
沿着code_verifier
交换访问令牌
问题是,在步骤3中,在应用程序重定向到授权服务器然后重定向到idp之前,必须将code_verifier
存储在某个地方。该位置在哪里?
看起来像okta-oidc-js
这样的库将code_verifier
存储在sessionStorage中。这不会使您暴露于XSS攻击吗?即,如果在应用程序进入授权流并重定向之前,我将code_verifier
存储在sessionStorage中,则在回调时,是什么阻止了一些rouge扩展从URL阅读code
和从sessionStorage读取code_verifier
?这两种方法的组合可用于交换访问令牌。
2条答案
按热度按时间fykwrbwg1#
您所描述的是标准的SPA方式-它可能被恶意代码滥用,但由于授权代码只能使用一次,并且验证器不会存储很长时间,因此有一定的保护作用。
一个相关的XSS攻击是在一个隐藏的iframe上运行一个完整的OAuth授权重定向+代码交换--没有针对该攻击的保护措施,无论是否涉及后端或客户端机密。
如果您想严格要求安全性,那么正在出现的趋势更多的是后端对前端的方法,其中后端是运行在https://api.mywebdomain.com上的“代理API
最近有一个关于SPA安全here的很好的视频,更深入地讨论了这些威胁。浏览器是一个很难实现安全的地方,重定向伴随着风险。
但是,仍然建议将Web和API问题分开-例如,上述代理API不应妨碍公司通过内容交付网络部署其SPA。
登录舞蹈
在我看来,首选的方法总结如下,为完全控制和没有问题的最近浏览器的变化:
exdqitrt2#
我同意加里的方法,但有一点改变:带有代码和状态的响应url不需要被SPA截获并转换为对BFF的另一个POST调用如果在包含状态和代码验证器的流的开始在浏览器上设置安全cookie,响应url可以直接到达BFF,BFF然后将具有可用于执行代码交换的所有参数(状态和代码作为url参数,来自cookie的code_verifier)