Azure AD B2C 的 PKCE 身份验证流程问题:“提供的 code_verifier 无效”

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

我目前正在尝试使用 PKCE 方法获取 Azure AD B2C 的访问令牌,以传递到 API 管理中的 Azure Function API。我将以下 URL 传递到浏览器中,以在登录时生成“代码”查询参数:

https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{user-flow}/oauth2/v2.0/authorize?client_id=_&response_type=code&redirect_uri=_&scope=_&code_challenge=_&code_challenge_method=S256

我可以登录,但是当我登录时,我收到以下错误消息:

AADB2C90183: The supplied code_verifier is invalid

我希望得到有效的响应,因为我尝试了相同的 URL,但没有使用 code_challenge 和 code_challenge_method 查询参数,并且我可以正确进行身份验证。执行此方法的问题是下一步需要 client_secret 值。这就是我首先尝试使用 PKCE 的原因,因为它不需要 client_secret 来访问令牌。

我还尝试了不同的网站来生成 code_verifier 和 code_challenge,甚至创建一个 Azure 函数来创建这些值,但是我仍然返回相同的错误。

我对如何解决这个问题感到困惑,因为当我尝试登录没有 code_challenge 和 code_challenge_method 的 URL 时,该 URL 在身份验证流程中工作(只是不像我想要的那样使用 PKCE),但是当我使用网站和我自己的代码时生成 code_verifier 和 code_challenge,我仍然收到相同的错误。有没有人对这个问题有任何见解?

azure oauth-2.0 azure-ad-b2c openid-connect pkce
1个回答
0
投票

使用“S256”作为代码挑战方法,您的code_challenge需要是代码验证器的ASCII编码的base64-urlencoded SHA256哈希

现在我不知道你的意思是否是真的使用“_”作为 code_challenge,但这显然不是 S256 code_challenge 的有效值。

我也不知道您在生成它们时使用了哪些 code_challenge / code_verifier 对,但如果我带您了解如何生成有效对,并且您可以看看这是否适合您,这可能会有所帮助。

首先,生成一个code_verifier。 这需要是一个长度在 43 到 128 个字符之间的加密安全随机字符串,由字符 [A-Z] / [a-z] / [0-9] / "-" / "" 组成。 /“_”/“~”。

然后需要使用上述方法生成code_challenge。例如,在 Python 中我会这样做:

import secrets
import hashlib
import base64

code_verifier = secrets.token_urlsafe(32)
h = hashlib.sha256(code_verifier.encode('ascii')).digest()
code_challenge = base64.urlsafe_b64encode(h).rstrip(b'=').decode('ascii')

然后,您可以在初始授权请求中传递 code_challenge,然后在收到来自 OIDC 重定向的授权代码后,在令牌请求中传递 code_verifier。

您还应该检查请求中的其他参数 - 例如,redirect_uri 应与预注册的重定向 URI 之一匹配。我再次不确定您是否真的在这里使用“_”。

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