使用 response_type=code
与 scope=openid email
对支持OpenID的OAuth2授权服务器进行身份验证后,调用令牌 endpoints 应返回 id_token
.
我缺少的是 id_token
是否应该包含 email
- 客户端应该在这种情况下调用 userInfo
endpoints .
规范说:
http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
如第5.3.2节所述,当使用response_type值导致发出访问令牌时,将从UserInfo endpoints 返回配置文件,电子邮件,地址和电话范围值请求的声明 . 但是,当没有发出访问令牌时(响应类型值为id_token的情况),结果声明将在ID令牌中返回 .
根据我的理解,这意味着 id_token
不需要包含 email
如果 access_token
可用,因为应该调用 userInfo
来获取它 . 然而,在https://github.com/bitly/oauth2_proxy中查看oidc客户端的实现,似乎他们确实要求 email
声明在 id_token
内可用而不调用 userInfo
endpoints .
OpenID兼容授权服务器中的正确行为是什么?
3 回答
openid规范比谷歌或微软正在做的更严格(可能是其他提供商,但我没有't check). I guess oauth2_proxy kept the provider'的行为 . 例如谷歌,在交换
code
为access_token
时,你要求的范围内的所有索赔都返回id_token
. 但如果您阅读他们的文档,他们会指定userInfo
endpoints :https://developers.google.com/identity/protocols/OpenIDConnect我认为只要您支持所有 endpoints ,是否将
id_token
与access_token
一起返回id_token
取决于您是谁 . 在大多数情况下,它会删除对userInfo
的一次额外调用,并且不会暴露任何漏洞 .OpenID Connect Core表示id_token可能包含其他声明 . SAML断言中的属性也是可选的 . 某些SaaS提供程序可能会反对Userinfo API调用(即SAML中的工件) . 在Gluu Server中,我们为legacyIdTokenClaims提供了服务器级JSON配置选项 . 默认情况下禁用此选项 - 在令牌 endpoints 上显示代码client_creds可提高安全性 . 如果设置为true,Gluu Server将包含与为客户端指定的OpenID范围对应的声明 .
另见https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter
使用
response_type=code
时,适用第2节和第3.1.3.6节 .因此,作为OpenID Connect 1.0客户端,您不应期望在ID令牌中出现除第2节和
at_hash
中定义的声明之外的其他声明 . 我不相信OpenID Connect 1.0禁止ID令牌中的其他声明(例如来自用户的配置文件),但通用客户端不应该依赖它们的存在 .这意味着oauth2_proxy不是通用客户端,因为它依赖于特定提供商的实现 .