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

Posted

技术标签:

【中文标题】Auth0 PKCE Grant 无法验证代码验证器【英文标题】:Auth0 PKCE Grant Can't verify code verifier 【发布时间】:2018-09-01 07:40:46 【问题描述】:

我有一个想要使用 Auth0 授权的客户端应用程序,并且我正在使用此处描述的工作流程:

https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce

唯一的问题是我使用的是 python,所以我编写了自己的挑战/验证器对。

def base64URLEncode(random_bytes):
    return urlsafe_b64encode(random_bytes)


def sha256(buffer):
    m = hashlib.sha256()
    m.update(buffer)
    return m.digest()

verifier = base64URLEncode(secrets.token_bytes(32))
challenge = base64URLEncode(sha256(verifier))

该应用程序是一个 Flask 命令行应用程序,它打开一个页面供用户在其网络浏览器中使用 google 登录,然后侦听重定向 URI 以获取响应代码。

我这样构造 URL 来启动授权:

url = DOMAIN + urllib.parse.urlencode(params)
webbrowser.open(url)

我从谷歌登录取回代码,但是当我尝试用代码交换访问令牌时:

payload = 
    'grant_type': 'authorization_code',
    'client_id': CLIENT_ID,
    'code_verifier': verifier,
    'code': code,
    'redirect_uri': 'http://localhost:5001/get_code'

res = requests.post("https://cidc-test.auth0.com/oauth/token", json=payload)

我收到以下类型的错误:

'error': 'invalid_grant', 'error_description': 'Failed to verify code verifier'

我不确定为什么验证器不好,因为在本地检查它,验证器摘要到与挑战相同的值。

【问题讨论】:

【参考方案1】:

好的,事实证明这是 Auth0 的一个特定问题,Auth0 不希望 base64 编码字符串末尾的填充字符。我的代码一旦添加就可以工作。

【讨论】:

我现在面临着类似的问题。我不完全确定这对你有什么影响。 url 编码应该已经删除了 Base64 字符串末尾的填充。所以我想你指的是别的东西。非常感谢您提供指向您所做更改的指针! @AndreasBaumgart 简而言之,您必须将“+”的任何实例替换为“-”,将“/”的任何实例替换为“-”,并将“=”的任何实例替换为空,所以在python中trimmed = code.replace('+', '-').replace('/', '-').replace('=', '').encode('utf-8') .Replace('+', '-').Replace('/', '_').Replace("=", "") 帮助了我。使用tonyxu-io.github.io/pkce-generator作为验证工具。

以上是关于Auth0 PKCE Grant 无法验证代码验证器的主要内容,如果未能解决你的问题,请参考以下文章

在 ReactJS 中的 Spotify API 上为 PKCE 身份验证创建代码验证器和质询

Auth0 java-jwt 库无法验证有效令牌

如何使用 Keycloak 和 PKCE 流实现 React SPA 身份验证?

auth0 401 错误,在尝试身份验证代码交换时进行身份验证

使用openid_client通过带有ke​​ycloak的pkce颤振应用程序进行身份验证后如何获取刷新令牌?

Auth0 - 验证 JWT