Python “的情况”;无效的“授权”;刷新访问令牌时出错?

Python “的情况”;无效的“授权”;刷新访问令牌时出错?,python,google-app-engine,google-oauth,Python,Google App Engine,Google Oauth,最近我一直在为这个问题发牢骚 一些背景 使用库管理用户的令牌。令牌用于定期和并发地执行各种后台任务 每次这些任务中的一个即将为用户运行时,我们都会从存储中获取凭据对象,如果过期时间大约为5分钟,则会进行刷新。否则,将重新使用当前访问令牌 有时,一个用户的多个任务同时运行 有一段时间一切正常,令牌会正常刷新 在其中一次尝试刷新期间,会间歇性地(似乎出乎意料地)返回一个“invalid_grant”错误,并使存储器中的刷新令牌完全无效。(发生的时间/方式/原因是我希望通过这个问题弄清楚的) 到处

最近我一直在为这个问题发牢骚

一些背景

  • 使用库管理用户的令牌。令牌用于定期和并发地执行各种后台任务
  • 每次这些任务中的一个即将为用户运行时,我们都会从存储中获取凭据对象,如果过期时间大约为5分钟,则会进行刷新。否则,将重新使用当前访问令牌
  • 有时,一个用户的多个任务同时运行
  • 有一段时间一切正常,令牌会正常刷新
  • 在其中一次尝试刷新期间,会间歇性地(似乎出乎意料地)返回一个“invalid_grant”错误,并使存储器中的刷新令牌完全无效。(发生的时间/方式/原因是我希望通过这个问题弄清楚的)
到处搜索,有很多关于这个问题的线程/报告。但到目前为止我所发现的一切都不适用于我们的案子。我将尝试列出到目前为止我研究过的问题:

  • 用户已撤销权限
  • 这是最明显的,记录最多的,并且很容易复制,但不幸的是,在我们的情况下,我们的用户(或我们自己,在测试时)根本没有撤销权限

  • 刷新“旧”访问令牌
  • 起初我认为一个用户一次只能有一个有效的访问令牌,并在OAuth2操场上验证

  • 每个客户机上每个用户最多有25个活动令牌。一旦达到该限制,较旧的访问令牌将自动失效,即使它们的过期日期尚未超过

    这对我们来说也是一条死胡同,因为我们的问题发生在刷新时,而不是使用最旧的访问令牌。这个限制只影响访问令牌,而不影响刷新令牌

  • 在短时间内请求刷新次数过多
  • 根本没有记录。只是顺便提一下,没有参考资料。试图通过在7秒内刷新25次来模拟它,但一切都很顺利。但没有参考资料,这是一个黑暗中的镜头。我们的后台任务最多每几分钟执行10个任务。继续

  • 并发刷新导致令牌成功的竞争条件
  • 。通过同时运行两个计划的任务在AppEngine上进行测试


    我想把这个问题弄清楚,真是束手无策。事实上,我们不能轻易地复制它是一种痛苦。我真的很想知道是什么原因导致我错过了这个

    这是我们的刷新代码:

    def refresh_oauth_credentials(user, credentials, force=False):
        if not credentials:
            return None
        logging.debug(credentials.token_expiry)
        do_refresh = credentials._expires_in() < 300
        if force or do_refresh:
            h = httplib2.Http()
            try:
                logging.debug('Refreshing %s\'s oauth2 credentials...' % user.email)
                credentials.refresh(h)
            except AccessTokenRefreshError:
                logging.warning('Failed to refresh.')
                return None
        return credentials
    
    def refresh\u oauth\u凭证(用户、凭证、强制=False):
    如果没有证书:
    一无所获
    logging.debug(凭证.token\u到期)
    do_refresh=凭据。_在()中过期
    如果强制或不刷新:
    h=httplib2.Http()
    尝试:
    logging.debug('正在刷新%s的oauth2凭据…'%user.email〕)
    凭据刷新(h)
    除AccessTokenRefreshError外:
    logging.warning('刷新失败')
    一无所获
    返回凭证
    
    消息实质上是说刷新令牌无效(过期、吊销等),或者与访问令牌请求详细信息(用户、范围)不匹配。因此,在您的问题中,您说“返回了一个“无效的授权”错误,并且它完全使存储中的刷新令牌无效”,这是另一种情况,即刷新令牌由于某种原因无效,这导致了“无效授权”

    如果在开发工作流程/测试期间为用户获得新的刷新令牌,那么我在开发过程中经常看到这一点

    在仔细检查(以及大量日志记录)之后,似乎有时OAuth2舞蹈的回调不包含刷新令牌。由于我假设如果为舞蹈提供了正确的参数,就会始终提供刷新令牌,因此我盲目地覆盖存储的令牌。我将开始一个新的问题,为什么我有时得不到刷新令牌。