在 PKCE 增强授权代码流中保护 code_verifier 的最佳实践
Best practice on Securing code_verifier in PKCE-enhanced Authorization Code Flow
由于 PKCE 现在是推荐的隐式流程授权方法,我正在寻找处理代码验证程序的最佳实践以及有关如何完成此操作的建议。高级 PKCE 授权流程包括:
- 在客户端生成
code_verifier
- 从 (1)
生成 code_challenge
- 用
code_challenge
命中 /authorise
重定向到 select idp 并且在回调中有一个 code
- 使用 (3) 中的
code
和 code_verifier
来交换访问令牌
问题是,在第 3 步中,在应用程序重定向到授权服务器和 idp 之前,必须将 code_verifier
存储在某处。 那个在什么地方?
似乎像 okta-oidc-js
这样的库将 code_verifier
存储在 sessionStorage 中。这不会让您受到 XSS 攻击吗?即,如果我在应用程序进入授权流程并在回调中重定向之前将 code_verifier
存储在 sessionStorage 中,是什么阻止了某些 rouge 扩展从 url 和 code
读取 code
=11=] 来自 sessionStorage?可以使用它们的组合来交换访问令牌。
您所描述的是标准的 SPA 处理方式 - 它可能会被恶意代码滥用,但在授权代码只能使用一次且验证程序不会被存储这一事实中存在一些保护措施很久了。
相关的 XSS 攻击是针对 运行 完整的 OAuth 授权重定向 + 隐藏 iframe 上的代码交换 - 无论涉及后端还是客户端机密,都没有针对这种攻击的保护措施。
如果你想严格控制安全性,新兴趋势更像是前端方法的后端,其中后端是 'Proxy API' 运行ning 在 https://api.mywebdomain.com
OAuth授权的结果是API发出的同站cookie,防止上述iframe攻击
然后 SPA 可以使用身份验证 cookie 获取访问令牌或通过代理 API 双跳 API 请求 API.
最近有一个关于 SPA 安全性的好视频 here 更深入地讨论了这些威胁。浏览器是一个难以实现安全性的地方,重定向伴随着风险。
仍然建议将 Web 和 API 问题分开 - 例如,上述代理 API 不应妨碍希望通过内容分发网络部署其 SPA 的公司。
登录舞蹈
在我看来,首选方法总结如下,以实现完全控制并且最近的浏览器更改没有问题:
SPA 调用 URL,例如 https://api.mywebdomain.com/login/start,它为包含状态和 code_verifier 的 .mywebdomain.com 写入仅 HTTP 加密 cookie,还有 returns 授权请求 URL
SPA 然后自己进行重定向,并在需要时将页面位置/状态预先保存到会话存储
SPA 然后接收带有代码和状态的响应 URL,然后将它们发布到 URL,例如 https://api.mywebdomain.com/login/end。之后SPA可以恢复它的页面位置和状态,所以可用性很好。
API 通过根据状态 cookie 中的状态验证状态,然后使用状态 cookie 中的 code_verifier 来完成登录。所有这一切的结果是编写了一个不能在 iframe 上滥用的身份验证 cookie(包含刷新令牌)。
我同意 Gary 的方法,但有一处改动。
带有代码和状态的响应 url 不需要被 SPA 拦截并转换为另一个 POST 对 BFF(前端的后端)的调用。
如果在包含状态和代码验证程序的流程开始时在浏览器上设置了安全 cookie,则响应 url 可以直接登陆 BFF,然后 BFF 将具有可用于执行代码交换的所有参数(状态和代码作为 url 参数,code_verifier 来自 cookie)
由于 PKCE 现在是推荐的隐式流程授权方法,我正在寻找处理代码验证程序的最佳实践以及有关如何完成此操作的建议。高级 PKCE 授权流程包括:
- 在客户端生成
code_verifier
- 从 (1) 生成
- 用
code_challenge
命中/authorise
重定向到 select idp 并且在回调中有一个code
- 使用 (3) 中的
code
和code_verifier
来交换访问令牌
code_challenge
问题是,在第 3 步中,在应用程序重定向到授权服务器和 idp 之前,必须将 code_verifier
存储在某处。 那个在什么地方?
似乎像 okta-oidc-js
这样的库将 code_verifier
存储在 sessionStorage 中。这不会让您受到 XSS 攻击吗?即,如果我在应用程序进入授权流程并在回调中重定向之前将 code_verifier
存储在 sessionStorage 中,是什么阻止了某些 rouge 扩展从 url 和 code
读取 code
=11=] 来自 sessionStorage?可以使用它们的组合来交换访问令牌。
您所描述的是标准的 SPA 处理方式 - 它可能会被恶意代码滥用,但在授权代码只能使用一次且验证程序不会被存储这一事实中存在一些保护措施很久了。
相关的 XSS 攻击是针对 运行 完整的 OAuth 授权重定向 + 隐藏 iframe 上的代码交换 - 无论涉及后端还是客户端机密,都没有针对这种攻击的保护措施。
如果你想严格控制安全性,新兴趋势更像是前端方法的后端,其中后端是 'Proxy API' 运行ning 在 https://api.mywebdomain.com
OAuth授权的结果是API发出的同站cookie,防止上述iframe攻击
然后 SPA 可以使用身份验证 cookie 获取访问令牌或通过代理 API 双跳 API 请求 API.
最近有一个关于 SPA 安全性的好视频 here 更深入地讨论了这些威胁。浏览器是一个难以实现安全性的地方,重定向伴随着风险。
仍然建议将 Web 和 API 问题分开 - 例如,上述代理 API 不应妨碍希望通过内容分发网络部署其 SPA 的公司。
登录舞蹈
在我看来,首选方法总结如下,以实现完全控制并且最近的浏览器更改没有问题:
SPA 调用 URL,例如 https://api.mywebdomain.com/login/start,它为包含状态和 code_verifier 的 .mywebdomain.com 写入仅 HTTP 加密 cookie,还有 returns 授权请求 URL
SPA 然后自己进行重定向,并在需要时将页面位置/状态预先保存到会话存储
SPA 然后接收带有代码和状态的响应 URL,然后将它们发布到 URL,例如 https://api.mywebdomain.com/login/end。之后SPA可以恢复它的页面位置和状态,所以可用性很好。
API 通过根据状态 cookie 中的状态验证状态,然后使用状态 cookie 中的 code_verifier 来完成登录。所有这一切的结果是编写了一个不能在 iframe 上滥用的身份验证 cookie(包含刷新令牌)。
我同意 Gary 的方法,但有一处改动。 带有代码和状态的响应 url 不需要被 SPA 拦截并转换为另一个 POST 对 BFF(前端的后端)的调用。 如果在包含状态和代码验证程序的流程开始时在浏览器上设置了安全 cookie,则响应 url 可以直接登陆 BFF,然后 BFF 将具有可用于执行代码交换的所有参数(状态和代码作为 url 参数,code_verifier 来自 cookie)