如何刷新存储的 Google oAuth 凭据

Posted

技术标签:

【中文标题】如何刷新存储的 Google oAuth 凭据【英文标题】:How can I refresh a stored Google oAuth credential 【发布时间】:2015-05-23 03:28:35 【问题描述】:

我正在使用谷歌提供的 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

【问题讨论】:

refresh_tokens 不会真正过期。如果您在 6 个月内不使用它,如果您向用户请求 26 个不同的 refresh_tokens,第一个将过期。假设您使用的是客户端库,一切都应该交给您。访问令牌在 60 分钟后过期。等待 60 分钟,然后测试是否有新的 我写了一个 Rails 应用程序,我尝试按照您的要求进行操作,即访问令牌的即时刷新。代码很糟糕,我无法在不破坏它的情况下重构它。最后,我只是连接了一个非常简单的 cronjob,它每小时刷新一次访问令牌,无论如何,不​​检查,什么都没有。像魅力一样工作。如果条件刷新对您不起作用,请考虑一下。 【参考方案1】:

只需检查过期访问令牌的情况并刷新您过期的访问令牌,如下所示:

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

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

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

if credentials is None or credentials.invalid:

【讨论】:

非常感谢。我注意到,只需将刷新密钥保留在文件中,它似乎就在“GET”上自动更新访问令牌到凭据文件。很酷。 这对我来说不适用于 Google Picasa。即使 access_token 已过期,它也总是返回 False。【参考方案2】:

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

【讨论】:

以上是关于如何刷新存储的 Google oAuth 凭据的主要内容,如果未能解决你的问题,请参考以下文章

Google OAuth 登录错误:凭据无效

java api中的Bigquery实例是不是在使用具有刷新令牌的凭据构建它后自动刷新它的Oauth 2.0授权?

用于配置 OAuth2 同意和凭据的 Google Cloud Platform API

Google OAuth2.0 是不是支持资源所有者密码凭据流的 OAuth 流?

Gmail API - Oauth2/google:找不到凭据(Golang)

使用 OAuth 登录的 Google 电子邮件返回 Chimlkat.Imap 的无效凭据