HttpAccessTokenRefreshError:invalid_grant ...一小时限制刷新令牌

时间:2017-03-06 01:08:39

标签: python google-sheets oauth-2.0 google-oauth google-sheets-api

我已经查看了有关此主题的其他问题,但它似乎与我的错误不符。我在运行Google Sheets APIv4时遇到错误:

raise HttpAccessTokenRefreshError(error_msg, status=resp.status) HttpAccessTokenRefreshError: invalid_grant

行[{1}}

上发生错误

此错误有时会弹出。如果我什么都不做,只需再次运行代码。它将再次通过身份验证流程,我得到了

service.spreadsheets().values().get(spreadsheetId=key, range=ranges).execute()

之后,我可以运行任何代码一段时间,直到再次弹出相同的Authentication successful. Storing credentials to C:\Users\jason\.credentials\sheets.googleapis.com-python-quickstart.json,然后我必须重新进行身份验证。

如何防止这种情况?

我正在使用找到的代码developers.google.com/sheets/api/quickstart/python。

我尝试使用HttpAccessTokenRefreshError: invalid_grant与以下

同步时间
ntp

但得到:

import time
import os
try:
    import ntplib
    client = ntplib.NTPClient()
    response = client.request('pool.ntp.org')
    os.system('date ' + time.strftime('%m%d%H%M%Y.%S',time.localtime(response.tx_time)))
except:
    print('Could not sync with time server.')

print('Done.')

输入当前日期后,没有任何反应。

我也看过这个页面。 https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35#.5utz2vcn6

当我运行超过1小时的代码完成时,也会出现此问题。在刷新令牌上。它总是炸弹。

现在我在想,令牌只持续一个小时,刷新时总是炸弹。

我已发布连接代码:

The system cannot accept the date entered.
Enter the new data: (mm-dd-yy)

2 个答案:

答案 0 :(得分:2)

总的来说,在调用之间刷新访问令牌似乎存在问题。

这或者意味着您的某些凭据未正确传递或者本地计算机的时间存在问题(尽管似乎不如第一个选项)

我建议研究此问题中陈述的可能性:https://github.com/google/oauth2client/issues/451

  1. (不太可能)为什么不尝试使用ntpdate强制更新时钟。安装ntp并试一试,因为用户表示为他工作
  2.   

    确定。经过一次研究,我想我发现了问题。事实上,用户凭据中缺少refresh_token,但问题很棘手。

         

    当应用程序要求用户提供权限时,首次提供刷新令牌。仅当流程的步骤1包括参数approval_prompt =" force"

    时,才会给出刷新令牌。      

    由于某些原因,用户(我)没有获得用户凭据中的refresh_token,因此我撤销了“我的帐户”中应用程序的权限 - >安全 - >应用程序,再次重新启动OAuth舞蹈。现在我得到了refresh_token。

  3. 更新#2选项:

    按照此guide和上述建议,我相信您必须添加到此代码段(直接从指南中获取):

    # Create a state token to prevent request forgery.
    # Store it in the session for later validation.
    state = hashlib.sha256(os.urandom(1024)).hexdigest()
    session['state'] = state
    # Set the client ID, token state, and application name in the HTML while
    # serving it.
    response = make_response(
        render_template('index.html',
                        CLIENT_ID=CLIENT_ID,
                        STATE=state,
                        APPLICATION_NAME=APPLICATION_NAME))
    

    prompt=consent行,然后执行上面引用的响应的第三步(选项2)。

    另一个选择是使用approval_prompt=force,但您必须在两者之间进行选择,因为它们不能很好地协同工作。

    祝你好运:)

答案 1 :(得分:1)

一些想法......

您发布的timekit.io博客链接非常适合运行备选方案。在你的情况下,它听起来并不像时间相关,而且ntp是矫枉过正的。只要你的时间或多或少是最新的,你就没事了。

您的代码运行,然后在"无效授权"一小时后失败。这意味着有些东西试图使用刷新令牌来生成新的访问令牌并失败。如果您正在进行自己的刷新,显然要检查您是否正确检索并使用刷新令牌。我的猜测是你依靠Google python库来做这件事(我讨厌图书馆大声笑)。

所以,对我来说,最可能的原因是: -

  1. 刷新令牌未正确保存并恢复用于刷新
  2. 刷新令牌是陈旧的(即超过25个刷新令牌旧)。如果在开发期间运行重复测试,则会发生这种情况始终确保使用最新的RT。
  3. 刷新令牌为空,因为它仅在用户第一次授权您的应用程序时提供。尝试进入https://myaccount.google.com/permissions?pli=1并删除对您应用的权限,然后重新开始。
  4. 如果您可以捕获http跟踪,它将在调试中提供很多帮助。查看python库是否具有可以打开的任何调试/日志功能(我知道Java库的功能)。