【问题标题】:How to use google python oauth libraries to implement OpenID Connect?如何使用 google python oauth 库来实现 OpenID Connect?
【发布时间】:2018-07-15 17:20:50
【问题描述】:

我正在为在 G Suite 域中运行的应用评估在 python App Engine flex 环境中进行身份验证的不同选项。

我正在尝试将 OpenID Connect“服务器流”指令 heregoogle-auth-library-python 如何实现一般 OAuth2 指令 here 放在一起。

我会一直跟进到 4。访问令牌和 ID 令牌的交换代码,看起来像 flow.fetch_token,除了它说“对此请求的响应包含 JSON 数组中的以下字段”,它不仅包括访问令牌,还包括 id 令牌和其他东西。我确实看到了this patch to the library。这是否意味着我可以使用一些 flow.fetch_token 创建一个 IDTokenCredentials(如何?),然后使用它来构建一个 OpenID Connect API 客户端(以及该 API 记录在哪里)?那么验证 id 令牌呢,是否有一个单独的 python 库来帮助解决这个问题,或者它是 API 库的一部分?

这一切都非常令人困惑。用一些实际的“坚果汤”示例代码可以解决很多问题,但我在互联网上的任何地方都没有找到任何东西,这让我想(a)也许这不是一种可行的身份验证方式,或者(b ) 最近 python 库还没有跟上?然而,我更愿意在服务器上进行身份验证,而不是在客户端使用 Google 登录。

非常感谢任何建议或代码链接。

【问题讨论】:

    标签: python google-app-engine google-oauth openid-connect


    【解决方案1】:

    Google 的 python 库似乎包含一个用于 id 令牌验证的模块。这可以在google.oauth2.id_token module 找到。验证后,它将返回解码后的令牌,您可以使用该令牌获取用户信息。

    from google.oauth2 import id_token
    from google.auth.transport import requests
    
    request = requests.Request()
    
    id_info = id_token.verify_oauth2_token(
        token, request, 'my-client-id.example.com')
    
    if id_info['iss'] != 'https://accounts.google.com':
        raise ValueError('Wrong issuer.')
    
    userid = id_info['sub']
    

    获取用户信息后,应按照Authenticate the user section 中所述的身份验证流程进行操作。

    【讨论】:

    • 谢谢。是的,我确实看到了(以及如何缓存证书的代码)。问题的另一半是如何在 Web 应用程序流中首先发出令牌请求以获取 id 令牌。也许此时必须手动完成?
    【解决方案2】:

    好的,我想我现在在源代码中找到了答案。

    google.oauth2.credentials.Credentials 暴露id_token

    根据授权服务器和请求的范围,这可能会在获取凭据时填充,并在调用refresh 时更新。此令牌是 JWT。可以使用google.oauth2.id_token.verify_oauth2_token 对其进行验证和解码[正如@kavindu-dodanduwa 指出的那样]。

    several layers down the call stack 我们可以看到fetch_token 对响应 JSON 进行了一些最小验证(检查是否返回了访问令牌等),但基本上通过它从令牌端点获得的任何内容,包括(即,如果包括 OpenID Connect 范围)作为 JWT 的 id 令牌。

    编辑:

    难题的最后一部分是将令牌从(通用)OAuthSession 转换为google_auth_oauthlib.helpers 中的(Google 特定)凭据,其中id_token 被抓取(如果存在)。

    请注意 the generic oauthlib library does seem to implement OpenID Connect now,但它看起来是最近的并且正在处理中(2018 年 7 月)。谷歌目前似乎没有使用任何这些(这让我有点失望)。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多