我觉得这可能是一个愚蠢的问题,但我找不到任何人确切地说出它。
我正在进行第三方集成,并使用OAuth 2.0 Authorization Grant和PKCE进行身份验证。有时它可以工作,有时它会失败,并显示有关PKCE挑战的消息。通过查看日志,我可以看到对于失败的PKCE挑战在/authorize调用和/token调用之间重新生成。
我已经尝试了各种方法来阻止它在这些调用之间重新生成挑战,但是,我还没有找到解决方案。我的选择有限,可见性有限,因为这是第三方集成(Zapier集成在Node中),这增加了难度。
所以为了确定...我应该在每次运行身份验证步骤时生成这个PKCE挑战,还是我可以生成一次并存储在ENV变量中?感觉后者是不合适的,但我问,因为我已经没有主意了。
2条答案
按热度按时间dwthyt8l1#
PKCE有两个方面:
申请
这会在前通道发送一个code_challenge,然后在后通道发送一个code_verifier--参见我的博客文章中的steps 4 and 8。Online tools可以用来检查这些值是否正确匹配。
对于Web客户端,此值存储在会话存储或浏览器重定向的HTTP Only cookie中。移动的客户端可以使用内存存储。每次身份验证尝试时都必须执行此操作。
授权服务器
AS必须在第一个请求中存储值,然后在第二个请求中查找它。对于任何兼容的提供程序来说,这应该是现成的。
根据this link的说法,也许Zapier不需要,也许它需要你使用没有PKCE但有服务器端客户端秘密的旧流?
6ljaweal2#
每次启动身份验证流时,都应该创建一个新的code_verifier和code_challenge。为这些参数使用静态值会降低应用程序的安全性。
PKCE(Proof Key for Code Exchange)的目的是防止恶意方拦截授权码并使用它来请求访问令牌。当您为每个身份验证流使用唯一和随机的code_verifier和code_challenge值时,攻击者伪造请求并获得访问令牌将变得更加困难。
通过为每次身份验证尝试生成新的code_verifier和code_challenge,您可以确保即使攻击者拦截了授权代码,在不知道正确的code_verifier的情况下,他们也无法将其交换为访问令牌。这增强了应用程序的安全性,并有助于保护用户数据。
这里是oauth2文档,其中包含代码示例如何在客户端生成代码质询和代码验证器,当重定向发生时,它可以存储在会话存储或cookie中https://auth0.com/docs/get-started/authentication-and-authorization-flow/call-your-api-using-the-authorization-code-flow-with-pkce。