如何刷新存储的 Google oAuth 凭证?

4
我正在使用谷歌提供的Python API。我想要做的就是确保访问令牌不会过期。我已经将refresh_token保存在凭据文件中,但不确定在调用API之前如何“检查”令牌是否仍然有效,以及如果需要刷新,则重新存储它在凭据文件中。
我进行了测试,即使我从凭证文件中删除了访问令牌,也可以使用refresh token将其重写到凭证文件中。我希望这对于过期的访问令牌也适用。
谢谢
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

刷新令牌不会真正过期。如果您在6个月内没有使用它,则会过期;如果您从用户那里请求了26个不同的刷新令牌,则第一个将过期。假设您正在使用客户端库,一切都应该为您处理。访问令牌在60分钟后过期。等待60分钟并测试是否获得新的令牌。 - Linda Lawton - DaImTo
我写了一个Rails应用程序,尝试做你所要求的事情,即访问令牌的即时刷新。代码很糟糕,我无法重构它而不破坏它。最后,我只是连接了一个非常简单的cronjob,每小时刷新一次访问令牌,不管任何情况,没有检查,没有其他操作。效果非常好。如果条件刷新对您不起作用,请考虑这个方法。 - Paul Dacus
2个回答

9

只需检查过期访问令牌的情况,并像以下这样刷新您的过期访问令牌:

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

提示:在开发过程中,您可以通过编辑凭据文本文件中的访问令牌到期日期,并将其强制设置为早于一小时来进行测试。

另外,在您的代码中检查if not credentials:的行上,您可以使用以下更好的方式处理该情况:

if credentials is None or credentials.invalid:

1
非常感谢。我注意到只要在文件中保持刷新密钥,它似乎会自动更新访问令牌,仅在对凭据文件的“GET”操作时。非常酷。 - BostonMacOSX
对于谷歌 Picasa,这对我不起作用。即使访问令牌已过期,它始终返回 False。 - Khurshid Alam

6
在尝试使用 from_authorized_user_info 构建凭据对象时,我遇到了这个问题,我想寻找一种刷新访问令牌的方法。不幸的是,以下代码对我无效:
credentials.refresh(httplib2.Http())

但我发现这个Oauth库的文档非常好用,以下是分享的内容:
import google.auth.transport.requests
import requests

request = google.auth.transport.requests.Request()
credentials.refresh(request)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接