加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 刷新访问令牌时出现“invalid_grant”错误的情况?

发布时间:2020-12-20 13:45:16 所属栏目:Python 来源:网络整理
导读:我最近一直在讨论这个问题. 一些背景 使用oauth2client库管理用户的令牌.令牌用于定期和同时执行各种后台任务. 每当其中一个任务即将为用户运行时,我们从存储中获取Credentials对象,并在到期时间约为5分钟时进行刷新.否则,重新使用当前访问令牌. 有时,1个用
我最近一直在讨论这个问题.

一些背景

>使用oauth2client库管理用户的令牌.令牌用于定期和同时执行各种后台任务.
>每当其中一个任务即将为用户运行时,我们从存储中获取Credentials对象,并在到期时间约为5分钟时进行刷新.否则,重新使用当前访问令牌.
>有时,1个用户的多个任务同时运行
>一段时间一切正常,令牌正常刷新
>在这些尝试刷新之一中,间歇性地并且看似异常突然,返回“invalid_grant”错误,并且它使存储中的刷新令牌完全无效. (何时/如何/为什么会发生这是我希望通过这个问题弄清楚的)

搜索周围,有很多关于这个问题的线程/报告.但到目前为止我发现的所有内容都不适用于我们的案例.我将尝试列出我到目前为止所研究的内容:

>用户已撤消权限

这个是最明显的,记录最多且易于重现的,但不幸的是,在我们的案例中,我们的用户(或我们自己,在测试时)根本没有撤销权限.

>刷新“旧”访问令牌

起初我认为用户一次只能有一个有效的访问令牌. That is false,并在OAuth2 Playground上验证.

> User has too many active access tokens

每个用户每个用户最多有25个活动令牌.达到该限制后,即使其过期日期尚未过期,旧的访问令牌也会以静默方式失效.

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

>在很短的时间内请求刷新太多次

根本没有记录.只提及没有参考.试图通过在7秒内刷新25次来模仿它,但一切顺利.但没有参考,这是一个黑暗中的镜头.我们的后台任务每隔几分钟最多只需10次.继续.

>并发刷新会导致令牌成功的竞争条件

I’ve asked a question here,but this wasn’t the case.通过运行同时安排的两个任务在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

解决方法

该消息实质上是说刷新令牌无效(已过期,已撤销等)或与访问令牌请求详细信息(用户,范围)不匹配.因此,在你的问题中,你说“返回了一个”invalid_grant“错误,并且它完全使存储中的刷新令牌无效”,反之亦然,即.由于某种原因刷新令牌无效,这导致“无效授权”.

我在开发期间已经看到了很多,如果在开发工作流/测试期间,您正在为用户获取新的刷新令牌.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读