对于正在G Suite域内运行的应用,我正在评估python App Engine flex环境中用于身份验证的不同选项。
我正在尝试将OpenID Connect“服务器流”指令here与google-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登录功能的客户端中进行身份验证。
非常感谢任何建议或代码链接。
答案 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目前似乎没有使用任何这些功能(这让我有点失望)。