RefreshError('invalid_grant:令牌已过期或撤销。')Google API

问题描述 投票:0回答:2

大约一周前,我在谷歌上设置了一个应用程序。现在当我尝试跑步时:

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
creds = None
if os.path.exists('token.pickle'):
     with open(self.CREDENTIALS_PATH+self.conjoiner+'token.pickle', 'rb') as token:
        creds = pickle.load(token)
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request()) ##error here

我收到以下错误:

Exception has occurred: RefreshError
('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})

可能是什么问题?

python google-api google-oauth gmail-api google-api-python-client
2个回答
1
投票

token.pickle 包含应用程序的访问令牌和刷新令牌。

令牌已过期或被撤销。'

意味着此文件中的引用令牌不再起作用,这可能是由服务器原因引起的。

  1. 用户撤销了您的访问权限
  2. 用户已授权您的访问令牌超过 50 次,这是最旧的令牌,并且已过期
  3. 刷新令牌已六个月未使用
  4. 该项目仍处于测试阶段,刷新令牌将在7天后过期。

以上所有信息都可以在Oauth2过期文档

中找到

选项1-3的解决方案是简单地删除token.pickle文件并再次请求用户授权。

对于第四点,您应该转到 Oauth2 同意屏幕下的 Google 开发者控制台,并将您的应用程序设置为生产。然后您的刷新令牌将停止过期。然后你就可以删除token.pickle,就不会再出现这个问题了。


0
投票

这里或那里的答案都没有让我回到正轨,但解决方案非常简单(而且晦涩):

  • 删除您的谷歌令牌
    .pickle
    文件并重新运行您的脚本。

就我而言,我使用的是 Google Sheets API 的 Julia 包装器,名为 GoogleSheets。在这种情况下,这两个文件以

google_sheets_token
开头,并与
~/.julia/config/google_sheets/
文件一起存储在
credentials.json
中。

我不知道为什么有两个 pickle 文件(也许是两个身份验证范围,尽管公平地说,谷歌的身份验证方案对我来说很神秘),但删除这两个文件会导致下次运行脚本时抛出 OAuth浏览器窗口中出现提示,一切又恢复正常了。

它们似乎经常过期,并且有各种关于其原因的可靠理论。但原因似乎随着它们过期而发生变化,因此每次删除它们似乎是最可靠的修复方法。

© www.soinside.com 2019 - 2024. All rights reserved.