我正在使用谷歌提供的Python API。我想要做的只是确保访问令牌不会过期。我将refresh_token存储在凭证文件中。我只是不确定如何检查'在调用API之前令牌仍然很好,如果需要刷新它并将其重新存储在凭证文件中。
我做了一个测试,即使我从凭证文件中删除了使用刷新令牌将其重写为凭证的访问令牌。我希望这也适用于过期的访问令牌。
由于
storage = Storage('cred_storage.txt')credentials = storage.get()
if not credentials: flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) authorize_url = flow.step1_get_authorize_url() print 'Go to the following link in your browser: ' + authorize_url code = raw_input('Enter verification code: ').strip() credentials = flow.step2_exchange(code) storage.put(credentials)
http = httplib2.Http() http = credentials.authorize(http) print http service = build('admin', 'reports_v1', http=http) print service data_query = service.customerUsageReports().get(**{'date':'2015-01-07'}) feed = data_query.execute() print feed
答案 0 :(得分:7)
只需检查过期访问令牌的情况,并刷新过期的访问令牌,如下所示:
if credentials.access_token_expired:
credentials.refresh(httplib2.Http())
提示:在开发此功能时,您可以通过在凭据文本文件中编辑访问令牌到期日期并强制它超过一小时进行测试
此外,在您检查if not credentials:
行的代码中,您可以通过以下方式更好地处理该案例:
if credentials is None or credentials.invalid:
答案 1 :(得分:3)
在使用from_authorized_user_info
构造凭证对象时,我试图找到一种刷新访问令牌的方法时遇到了这个问题。不幸的是,以下代码对我不起作用:
credentials.refresh(httplib2.Http())
但是我从Oauth库中发现了这个documentation,这很神奇。在下面共享:
import google.auth.transport.requests
import requests
request = google.auth.transport.requests.Request()
credentials.refresh(request)