我有一个客户端应用程序,我想使用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命令行应用程序,它打开一个页面供用户在其Web浏览器中使用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'}
我不确定为什么验证程序不好,因为在本地检查它,验证程序会消化到与挑战相同的值。
答案 0 :(得分:0)
好吧事实证明这是Auth0的一个特定问题,Auth0不想在base64编码字符串的末尾填充字符。我的代码一旦添加就可以工作了。