我每次都会生成新的 PKCE 挑战还是可以存储的东西?

问题描述 投票:0回答:3

我觉得这可能是一个愚蠢的问题,但我找不到任何人能准确地拼写出来。

我正在开发第三方集成,并使用 OAuth 2.0 授权授予和 PKCE 进行身份验证。有时它会起作用,有时会失败并显示有关 PKCE 挑战的消息。通过查看日志,我可以看到对于失败,PKCE 质询会在 /authorize 调用和 /token 调用之间重新生成。

我尝试了多种方法来阻止它在这些调用之间重新生成挑战,但是,我还没有找到解决方案。我的选择和可见性有限,因为这是第三方集成(Node 中的 Zapier 集成),这增加了难度。

所以为了确定......我应该在每次运行身份验证步骤时生成这个 PKCE 质询,还是我可以生成一次并存储在 ENV 变量中?感觉后者不合适,但因为我没有想法所以才问。

node.js oauth-2.0 zapier pkce
3个回答
1
投票

每次启动身份验证流程时,您都应该创建一个新的 code_verifier 和 code_challenge。对这些参数使用静态值会降低您的应用程序的安全性。

PKCE(代码交换证明密钥)的目的是防止恶意方拦截授权代码并使用它来请求访问令牌。当您为每个身份验证流程使用唯一且随机的 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


0
投票

PKCE 有两个方面:

申请

这会在前通道上发送一个 code_challenge,然后在后通道上发送一个 code_verifier - 请参阅我的博客文章中的步骤 4 和 8在线工具可用于检查这些值是否正确匹配。

对于 Web 客户端,此值存储在会话存储或整个浏览器重定向的 HTTP Only cookie 中。移动客户端可以使用内存存储。每次身份验证尝试时都必须发生这种情况。

授权服务器

AS 必须存储第一个请求的值,然后在第二个请求时查找它。对于任何合规的提供商来说,这应该是开箱即用的。

根据此链接,也许 Zapier 不会。也许它要求您使用没有 PKCE 但具有服务器端客户端密钥的旧流程?


0
投票

我也担心同样的事情。但是,我认为一个好的解决方案是对 PKCE 代码使用 SessionStorage (https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage) 而不是 LocalStorage。这样,如果他们打开多个选项卡并跨多个选项卡启动登录流程,每个选项卡将保留自己的 PKCE 代码。

© www.soinside.com 2019 - 2024. All rights reserved.