使用response_type=code
scope=openid email
对支持OpenID的OAuth2授权服务器进行身份验证后,调用令牌端点应返回id_token
。
我缺少的是id_token
是否应该包含email
- 客户端应该在这种情况下调用userInfo
端点。
规范说:
http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
当使用导致发出访问令牌的response_type值时,将从UserInfo端点返回配置文件,电子邮件,地址和电话范围值所请求的声明,如第5.3.2节所述。但是,当没有发出访问令牌时(response_type值为id_token的情况),结果声明将在ID令牌中返回。
据我了解,这意味着如果id_token
可用,则email
不需要包含access_token
,因为userInfo
应该被调用来获取它。不过,在https://github.com/bitly/oauth2_proxy中查看oidc客户端的实现情况似乎确实需要email
声明在id_token
内可用而不调用userInfo
端点。
OpenID兼容授权服务器中的正确行为是什么?
答案 0 :(得分:1)
openid规范比Google或Microsoft所做的更为严格(可能还有其他提供商,但我没有检查)。
我想oauth2_proxy保留了提供程序的行为。
以Google为例,当将shared#
换成id_token
时,返回code
并包含您请求范围内的所有声明。但是,如果您阅读了他们的文档,他们确实指定了access_token
端点:
https://developers.google.com/identity/protocols/OpenIDConnect
我认为,只要您支持所有端点,是否由userInfo
连同所有声明一起返回id_token
的决定就由您决定。在大多数情况下,它会删除对access_token
的一个额外调用,并且不会暴露任何漏洞。
答案 1 :(得分:1)
OpenID Connect Core说id_token可能包含其他声明。在SAML断言中,属性也是可选的。某些SaaS提供程序可能会反对Userinfo API调用(即SAML中的工件)。在Gluu服务器中,我们为legacyIdTokenClaims提供了服务器级别的JSON配置选项。默认情况下禁用此功能-在令牌端点上显示代码+ client_creds更好地保证了安全性。如果将其设置为true,则Gluu服务器将包含与为客户端指定的OpenID范围相对应的声明。
答案 2 :(得分:0)
另请参阅https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter
如果不存在,则根据Section 2中的ID令牌定义以及第3.1.3.6,3.2.2.10节中的其他按流ID令牌要求来请求默认的ID令牌声明。 ,3.3.2.11和3.3.3.6。
使用response_type=code
时,适用第2节和第3.1.3.6节。
ID令牌的内容如第2节所述。使用授权码流时,适用以下ID令牌声明的这些附加要求: at_hash:[…]
因此,作为OpenID Connect 1.0客户端,您不应期望ID令牌中出现第2节和at_hash
中定义的其他声明。我不相信OpenID Connect 1.0 禁止 ID令牌中的其他声明(例如来自用户的个人资料),但是通用客户端不应依赖于它们的存在。 / p>
这意味着oauth2_proxy不是通用客户端,因为它依赖于特定提供程序的实现。