在authorization_code流

时间:2018-06-07 11:53:07

标签: email oauth-2.0 openid claims userinfo

使用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兼容授权服务器中的正确行为是什么?

3 个答案:

答案 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.63.2.2.10节中的其他按流ID令牌要求来请求默认的ID令牌声明。 ,3.3.2.113.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不是通用客户端,因为它依赖于特定提供程序的实现。