如何解决为 google OAuth2.0 检索 refresh_token
正如 doc 所提到的,
# 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)
“生产应用程序,您可能希望将这些凭据保存在持久数据库中”。但是,访问令牌更改 periodically 导致我的代码:
@blueprint.route("Calendar",methods=['GET','POST'])
def Calendar():
user = User.query.filter_by(email=email).first()
with open('client_secret.json') as d:
d = json.load(d)
thecredentials = {
'client_id': d['web']['client_id'],'client_secret':d['web']['client_secret'],'refresh_token':None,'scopes':None,'token':user.token,'token_uri':d['web']['token_uri']
}
print(thecredentials) #prints all the credentials successfully
credentials = google.oauth2.credentials.Credentials(
**credentials)
thecredentials = credentials_to_dict(credentials)
service = build('calendar','v3',credentials=credentials)
events_result =service.calendarList().list().execute()
def credentials_to_dict(credentials):
return {'token': credentials.token,'refresh_token': credentials.refresh_token,'token_uri': credentials.token_uri,'client_id': credentials.client_id,'client_secret': credentials.client_secret,'scopes': credentials.scopes}
遇到:
Traceback (most recent call last):
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 2464,in __call__
return self.wsgi_app(environ,start_response)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 2450,in wsgi_app
response = self.handle_exception(e)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 1867,in handle_exception
reraise(exc_type,exc_value,tb)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/_compat.py",line 39,in reraise
raise value
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 2447,in wsgi_app
response = self.full_dispatch_request()
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 1952,in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 1821,in handle_user_exception
reraise(exc_type,line 1950,in full_dispatch_request
rv = self.dispatch_request()
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/flask/app.py",line 1936,in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/Daniyal/Startup/Website/app/base/routes.py",line 407,in Calendar
events_result =service.calendarList().list().execute()
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/googleapiclient/_helpers.py",line 134,in positional_wrapper
return wrapped(*args,**kwargs)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/googleapiclient/http.py",line 900,in execute
resp,content = _retry_request(
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/googleapiclient/http.py",line 177,in _retry_request
resp,content = http.request(uri,method,*args,**kwargs)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/google_auth_httplib2.py",line 216,in request
self.credentials.refresh(self._request)
File "/Users/Daniyal/Startup/Website/env/lib/python3.8/site-packages/google/oauth2/credentials.py",line 194,in refresh
raise exceptions.RefreshError(
google.auth.exceptions.RefreshError: 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.
问题:
- 如果用户的访问令牌每次都会改变,那么存储到持久数据库有什么意义?
- 错误是因为用户令牌已过时(它是)还是其他原因?导致错误似乎表明它不是。
在深入研究 docs 后,我意识到开发人员最有可能将刷新令牌保存到数据库中,因为它们的寿命更长。
但是,我的凭据是这样的:
{
'client_id': '3118..vc2n.apps.googleusercontent.com','client_secret': 'imMySiOXTb...R2w','refresh_token': None,'scopes': None,'token': 'ya29.a0Af...Oyi4JLHqi','token_uri': 'https://oauth2.googleapis.com/token'
}
我找不到任何关于如何检索刷新令牌的文档或代码片段,正如对 SO 的评论所说。
此外,作为样板代码 show,访问令牌保存在会话中(当用户在会话中时)并在我的 chrome 扩展程序请求用户的数据时很快过期用户一直在会话中,但在用户注册时仅进行一次身份验证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。