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

Posted

技术标签:

【中文标题】我每次都生成一个新的 PKCE 挑战还是可以存储的东西?【英文标题】:Do I generate a new PKCE challenge every time or is it something that can be stored? 【发布时间】:2021-11-20 18:17:27 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

PKCE 有两个方面:

应用

这会在前通道发送 code_challenge,然后在后通道发送 code_verifier - 请参阅我的博客文章中的 steps 4 and 8。 Online tools 可用于检查这些值是否正确匹配。

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

授权服务器

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

根据this link,也许 Zapier 没有。也许它需要您使用没有 PKCE 但带有服务器端客户端密码的旧流程?

【讨论】:

感谢您的解释。在这种情况下,zapier 集成是应用程序,而 okta 是身份验证服务器。使用 zapier,我无法保证每次调用都在同一个节点实例上,这意味着我无法将质询/验证器存储在内存中并期望它们始终匹配(这是我试图做的)。看起来他们正在考虑增加对它的支持。 听起来你应该让 Zapier 使用客户端 - 这是非常安全的,因为它可以防止将被盗的授权代码交换为令牌。多服务器问题通常通过发布加密 cookie 并在所有服务器实例上使用相同的解密密钥来解决。

以上是关于我每次都生成一个新的 PKCE 挑战还是可以存储的东西?的主要内容,如果未能解决你的问题,请参考以下文章

Auth0 PKCE Grant 无法验证代码验证器

RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换

Spotify PKCE 授权流程返回“code_verifier 不正确”

是否可以在 appWidget 中重用 RemoteViews 而不是每次都创建新的?我该如何存储它们?

分布式存储凭什么来挑战互联网巨头?

如何使用 PKCE 登录 Google.Apis.Drive.v3 for .NET?