如何刷新存储的 Google oAuth 凭据

How can I refresh a stored Google oAuth credential

我正在使用 google 提供的 Python API。我想要做的只是确保访问令牌不会过期。我将 refresh_token 存储在凭据文件中。我只是不确定如何 'check' 在调用 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

只需检查过期访问令牌的大小写并像这样刷新过期的访问令牌:

if credentials.access_token_expired:
    credentials.refresh(httplib2.Http())

提示:在开发这个时,您可以通过编辑凭证文本文件中的访问令牌到期日期并强制它超过一个小时来进行测试

此外,在您检查 if not credentials: 行的代码中,您可以更好地处理这种情况:

if credentials is None or credentials.invalid:

我在使用 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)