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 身份验证创建代码验证器和质询
如何使用 Keycloak 和 PKCE 流实现 React SPA 身份验证?
auth0 401 错误,在尝试身份验证代码交换时进行身份验证