access_token 无效时的 Google Calendar API

Posted

技术标签:

【中文标题】access_token 无效时的 Google Calendar API【英文标题】:Google Calendar API when access_token is invalid 【发布时间】:2015-03-23 03:50:50 【问题描述】:

我正在尝试在某人的谷歌日历中获取特定日期范围的事件。我正在执行以下操作:

    credentials = AccessTokenCredentials.from_json(token_json)
    http = httplib2.Http()
    if credentials.access_token_expired:
        credentials.refresh(http)
    else:
        http = credentials.authorize(http)

    service = build(serviceName='calendar', version='v3', http=http)
    events = service.events().list(calendarId='primary', pageToken=None,
                                   timeMin=rfc3339(start_dt),
                                   timeMax=rfc3339(end_dt))
    events = events.execute()

由于某种原因,当我到达最后一行 events = events.execute() 时,出现以下错误:

AccessTokenCredentialsError: The access_token is expired or invalid and can't be refreshed.

当我使用断点时,它从不在我的 if 语句中说 access_token_expired。这怎么能总是失败那个用例呢?我在刷新令牌时做错了什么吗?

我阅读了以下内容:

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-22#section-4.2.2

Google access token expiration time

【问题讨论】:

你是怎么解决的?我正在使用相同的方法,但无法刷新令牌......我将不胜感激任何指导。我正在使用 AccessTokenCredentials 和已经获得的令牌(手动用户同意)我有两个令牌但我无法刷新令牌令牌! 我的问题是我没有为令牌正确存储数据。我将credentials.to_json() 保存到我的数据库中。 你解决了吗?如果“是”,那么如何? 【参考方案1】:

尝试测试credentials.invalid

我有一个小例程,用于确保存储的凭据对于 gmail 单元测试始终是最新的。它可能/可能不适合您的情况。

from oauth2client.client import OAuth2WebServerFlow
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client import tools

# the stored credentials file to use for these tests
TEST_CREDENTIALS_FILE = 'testjoe.storage'


def get_credentials():
    """Utility routine to returns credentials for testing use"""

    # Location of the credentials storage file
    storage = Storage(TEST_CREDENTIALS_FILE)

    # Start the OAuth flow to retrieve credentials
    flow = flow_from_clientsecrets('client_secret_native.json', scope='https://www.googleapis.com/auth/gmail.modify')

    # Try to retrieve credentials from storage or run the flow to generate them
    credentials = storage.get()
    if credentials is None or credentials.invalid:
        flags = tools.argparser.parse_args(args=[])
        credentials = tools.run_flow(flow, storage, flags)
    return credentials

【讨论】:

以上是关于access_token 无效时的 Google Calendar API的主要内容,如果未能解决你的问题,请参考以下文章

Instagram 的错误:提供的 access_token 无效

Instagram错误,所提供的access_token无效。

如何在不使用google-api-nodejs-client的情况下处理Google API access_token已过期?

Google OAuth2 .Net HttpPost 请求 access_token 中缺少 refresh_token

我在哪里可以检查 google oauth 2.0 access_token 是不是有效?

access_token 怎么获取