如何使用谷歌python oauth库来实现OpenID Connect?

时间:2018-07-15 17:20:50

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

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

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

我一直跟进直到 4。类似于return RedirectToAction("action", "controller", new { area = "area" }); 的访问令牌和ID令牌的交换代码,但它表示“对此请求的响应在JSON数组中包含以下字段”,并且不仅包括访问令牌,还包括id令牌等。我确实看到了this patch to the library。这是否意味着我可以使用一些flow.fetch_token创建一个flow.fetch_token(如何?),然后使用它来构建一个OpenID Connect API客户端(该API在哪里记录了)?以及如何验证id令牌,是否有一个单独的python库可以帮助您解决此问题,或者是API库的一部分?

这一切都很混乱。可以通过一些实际的“胡说八道”示例代码清除大量内容,但是我在互联网上的任何地方都找不到任何东西,这使我认为(a)也许这不是进行身份验证的可行方法,或者(b )这么最近的python库还没赶上吗?但是,我宁愿在服务器上进行身份验证,而不是在具有Google登录功能的客户端中进行身份验证。

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

2 个答案:

答案 0 :(得分:2)

似乎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中所述进行身份验证过程。

答案 1 :(得分:1)

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

google.oauth2.credentials.Credentials公开(\s*)

  

取决于授权服务器和所请求的范围,可以在获取凭据时进行填充,并在调用id_token时进行更新。此令牌是JWT。可以使用refresh对其进行验证和解码(正如@ kavindu-dodanduwa指出的那样)。

然后several layers down the call stack可以看到google.oauth2.id_token.verify_oauth2_token对响应JSON进行了一些最小的验证(检查是否返回了访问令牌等),但是基本上通过了从令牌端点获取的所有内容,包括(例如,如果包含OpenID Connect作用域),则将id令牌作为JWT。

编辑:

最后一个难题是将令牌从(通用)OAuthSession转换为google_auth_oauthlib.helpers中的(特定于Google的)凭据,如果存在fetch_token,则将其捕获。 / p>

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