【问题标题】:revoke function from google-api-python-client从 google-api-python-client 撤消函数
【发布时间】:2013-07-10 23:07:34
【问题描述】:

我正在使用来自 google-api-python-client 的内置 revoke 方法从 django 应用程序创建注销功能,但它似乎不起作用。这是我的代码。

def google_logout(request, user_id = None):
    storage = Storage(CredentialsModel, 'id', user_id, 'credential')
    credential = storage.get()

    if credential is not None:
        cr_json = credential.to_json()
        credential = credential.new_from_json(cr_json)

        http = httplib2.Http()
        http = credential.authorize(http)

        try:
        # Don't know yet why this is always raising an exception.
            credential.revoke(http)
            storage.delete()
        except TokenRevokeError:
            return HttpResponseBadRequest('Invalid Token.')
    else:
        return redirect('authentication:google_login')

这在我使用 django 1.4.5 时有效,但后来我需要升级到 1.5.1,现在它无法正常工作。这是一个django问题吗?我打赌不会。请帮忙。

附:我知道我可以通过手动将 access_token 传递给这个 url https://accounts.google.com/o/oauth2/revoke?token={token} 来撤销令牌,但我想使用 api 中提供的方法。

【问题讨论】:

  • 如果您删除了TokenRevokeError 周围的try:except,您应该会收到更详细的错误消息。您可以尝试一下,看看它是否有助于诊断错误?
  • 我已经尝试过了,似乎我的凭据对象中没有保存刷新令牌。我想知道为什么会这样,虽然它是写在 client.py self.params = {'access_type': 'offline', 'response_type': 'code',}
  • 我有同样的问题,@PhilamerSune,access_type 设置为offline(通过 API 客户端中的相同流构造函数,正如您使用的那样)但我显然没有在我的凭据对象中获取刷新令牌。不知道如何解决这个问题......
  • 啊,解决了,使用approval_prompt=force。在下面回答。

标签: django google-api google-api-python-client


【解决方案1】:

即使 access_type 设置为 offline,如果您过去收到过刷新令牌并且没有另外发送查询参数 approval_prompt 参数设置为force.

这尤其令人沮丧,并且可能在调试撤销期间发生。由于您可能经常批准和删除凭据,因此有时 Google 可能会记住批准并授权,而无需经过强制批准流程,在这种情况下,您将无法获得客户端 API 撤销所需的刷新令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2020-10-13
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多