我正在使用 Authlib 模块来测试 OAuth2 集成。我制作了一个简单的 Flask 应用程序,并尝试使用 Untappd API ( https://untappd.com/api/docs#authentication ) 进行授权。
遵循 Authlib Flask 模块 ( https://docs.authlib.org/en/latest/client/flask.html ) 的指导方针,我成功地被重定向并获得了授权码。
在authorize_redirect()
重定向我以在 Untappd 授权我的应用程序后,我批准,将我发送到我的回调 url,并在 url 中使用身份验证代码。
http://localhost:3000/callback?code=1B6D5B8154EC6627748001F&state=GwqinEMqcRDSjfKmNHh
我应该能够下次调用authorize_access_token()
以获取令牌,但这就是我得到的:
{'meta': {'http_code': 500, 'error_type': 'param_error', 'error_detail': 'Missing either the client_id, redirect_url, client_secret or code parameter. Please check your request a try again.'}, 'response': []}
我已经在 authlib 的配置中注册了 client_id、redirect_url、client_secret,所以我不知道缺少什么。使用我在 Postman 中测试并成功收到令牌的授权码
GET https://untappd.com/oauth/authorize/?client_id=CLIENTID&client_secret=CLIENTSECRET&response_type=code&redirect_url=REDIRECT_URL&code=CODE
{"meta":{"http_code":200},"access_token":"k43l4j3lj43lj43","response":{"access_token":"k43l4j3lj43lj43"}}
那么我的代码有什么问题?:
auth0 = oauth.register(
'auth0',
client_id=AUTH0_CLIENT_ID,
client_secret=AUTH0_CLIENT_SECRET,
api_base_url=AUTH0_BASE_URL,
access_token_url=AUTH0_BASE_URL + '/oauth/authorize',
authorize_url=AUTH0_BASE_URL + '/oauth/authenticate',
)
@auth_blueprint.route('/login')
def login():
redirect_uri = url_for('.callback', _external=True)
return auth0.authorize_redirect(redirect_uri)
@auth_blueprint.route('/callback')
def callback():
token = auth0.authorize_access_token()
print(token)
return redirect('/loggedin')
我唯一能想到的是授权代码没有在重定向中传递,但无法调试它。在我看来,Authlib 幕后发生的事情并没有得到很好的记录。
更新
我有一个想法要运行print(auth0.__dict__)
,看看我是否可以看到缺少什么参数。
{'name': 'auth0', 'client_id': '2226808DCDAF2FA5FFE145A', 'client_secret': '9494F1877AB0D01D9DE6AAF4', 'request_token_url': None, 'request_token_params': None, 'access_token_url': 'https://untappd.com/oauth/authorize', 'access_token_params': None, 'authorize_url': 'https://untappd.com/oauth/authenticate', 'authorize_params': None, 'api_base_url': 'https://untappd.com', 'client_kwargs': {}, 'oauth1_client_cls': None, 'oauth2_client_cls': <class 'authlib.integrations.requests_client.oauth2_session.OAuth2Session'>, 'compliance_fix': None, 'client_auth_methods': None, '_fetch_token': None, '_update_token': None, '_server_metadata_url': None, 'server_metadata': {'refresh_token_url': None, 'refresh_token_params': None}, '_fetch_request_token': None, '_save_request_token': None}
(id 和 secret 不是真实的)我看不到任何不应该存在的东西。