Google API Python客户端 - AccessTokenRefreshError

时间:2012-12-21 00:14:47

标签: python google-api google-oauth

def get_code(request):
    try:
        user_info_service = get_service(request.user, 'oauth2', 'v2')
        user_info = user_info_service.userinfo().get().execute()
        if user_info and user_info.get('id'):
            request.session['cur_user'] = user_info
            return redirect('/me')
        else:
            raise NoUserIdException()
    except AccessTokenRefreshError as atrfsh:
        print atrfsh
        print traceback.print_tb(sys.exc_info()[2])
    except:
        print "This was the exception..."
        print sys.exc_info()
        auth_uri = FLOW.step1_get_authorize_url()
        print auth_uri
        return redirect(auth_uri)

def get_service(user, name, version):
    storage = Storage(CredentialsModel, 'id', user, 'credential')
    credential = storage.get()
    http = httplib2.Http()
    http = credential.authorize(http)
    service = build(name, version, http=http)
    return service

我一直在AccessTokenRefreshError行上获得user_info = user_info_service.userinfo()

在AccessTokenRefreshError的except块中,它正在打印'invalid_grant'。

在阅读OAuth2Credentials对象的文档:http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.OAuth2Credentials-class.html#authorize后,我发现get_service中的credential.authorize方法显然应该自动执行访问令牌的刷新。

我无法刷新访问令牌,我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是一种解决方法!

我每隔10次调用tasklists.list()大约也会收到相同的错误,因此问题并非userinfo所独有。

我发现的唯一解决方案是将API调用放在重试循环中。立即重试失败,所以我在重试之前包含一个睡眠。 45秒的睡眠时间约为99.5%。

我希望有人可以发布更好的解决方案。