oauth - Google OAuth2 刷新过期且不会续订
问题描述
但是,我完全按照本教程进行操作
@app.route('/test')
def test_api_request():
if 'credentials' not in flask.session:
return flask.redirect('authorize')
# Load credentials from the session.
credentials = google.oauth2.credentials.Credentials(
**flask.session['credentials'])
drive = googleapiclient.discovery.build(
API_SERVICE_NAME, API_VERSION, credentials=credentials)
files = drive.files().list().execute()
# Save credentials back to session in case access token was refreshed.
# ACTION ITEM: In a production app, you likely want to save these
# credentials in a persistent database instead.
flask.session['credentials'] = credentials_to_dict(credentials)
return flask.jsonify(**files)
但是在这部分:
credentials = google.oauth2.credentials.Credentials(
**flask.session['credentials'])
刷新令牌在一小时后过期,出现以下错误:
The credentials do not contain the necessary fields need to refresh the access token. You must specify refresh_token, token_uri, client_id, and client_secret.
但显然在烧瓶会话中 dict 对象在那里:
{'client_id': '<COMMENTED_OUT>.apps.googleusercontent.com',
'client_secret': '<COMMENTED_OUT>',
'refresh_token': None,
'scopes': ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive',
'https://mail.google.com/'],
'token': '<COMMENTED_OUT>',
'token_uri': 'https://oauth2.googleapis.com/token'}
我相信谷歌教程会自动刷新令牌
两个问题 1) 我需要手动“刷新”刷新令牌吗?教程中的评论说“将凭据保存回会话以防访问令牌被刷新”..这意味着它会自动刷新
2)这是因为应用程序仍处于未验证状态吗?
解决方案
查看字典,缺少刷新令牌:
'refresh_token': None,
您需要此令牌才能在访问令牌过期后刷新它。仅当用户看到同意屏幕(列出所请求范围的屏幕)时,才会在 JSON 响应中提供刷新令牌。如果用户之前已批准访问,并且范围未更改,则 OAuth 流程将在用户被送回流程时跳过该屏幕,因此不会返回刷新令牌。
可能发生的情况是,在您的测试期间,您批准了一次访问,但没有正确存储刷新令牌。进一步尝试批准访问没有返回刷新令牌,因此您无法刷新访问令牌。
为确保始终返回刷新令牌,请prompt=consent
在授权 URL 中设置 URL 参数:
authorization_url, state = flow.authorization_url(
access_type='offline',
include_granted_scopes='true'
prompt='consent')
(它记录在此处的“HTTP/REST”选项卡中)。
或者,访问并撤销对您的应用程序的访问权限。下次您通过 OAuth 流程时,您应该会再次看到同意屏幕,并获得一个新的刷新令牌。
推荐阅读
- javascript - 如何检查数组索引是否不等于参数?
- python - python udp广播发送但不接收
- sql - 在这种情况下,聚合函数会发生什么?
- mysql - 错误:试图在 Laravel 中获取属性 ID 错误(非对象)
- python - 在管道中训练 RFE 和模型后无法预测新数据
- html - 允许表格滚动但保持文本框元素在底部可见
- python - 在字典中查找特定的键值对
- pine-script - 当天第一单的具体条件怎么写?
- pine-script - Pinescript/TradingView 如何制作堆肥表达
- python - 如何在自动 arima Python 中删除截距