【发布时间】: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'}
我不确定为什么验证器不好,因为在本地检查它,验证器摘要到与挑战相同的值。
【问题讨论】: