在 OpenID Connect 中,是不是可以将 id 令牌而不是访问令牌传递给资源服务器进行授权?

Posted

技术标签:

【中文标题】在 OpenID Connect 中,是不是可以将 id 令牌而不是访问令牌传递给资源服务器进行授权?【英文标题】:In OpenID Connect, is it okay to pass an id token instead of an access token to a resource server for authorization?在 OpenID Connect 中,是否可以将 id 令牌而不是访问令牌传递给资源服务器进行授权? 【发布时间】:2019-02-12 07:03:17 【问题描述】:

我正在考虑使用 id 令牌而不是 id 令牌进行授权,以便资源服务器可以验证其签名并从中提取用户 ID。这种方法有什么我不知道的缺点吗?

如果我丢弃访问令牌,我想我无法使用验证端点。对我们而言,用户授予访问权限的范围无关紧要,因为客户端应用程序和 OIDC 的身份提供者都归我们所有。

我正在使用这个库来实现 OAuth2 和 OpenID 服务器。 https://github.com/bshaffer/oauth2-server-php

【问题讨论】:

OpenID Connect : Is it fine to use id_token as access_token?的可能重复 【参考方案1】:

ID Token 的使用旨在用于客户端应用程序。客户端使用它来验证最终用户。所有这一切都是通过索赔 ID 令牌转移来实现的。这些声明内置在 JWT 中。简单来说,ID Token就是一个自包含的token。

现在,如果您控制所有目标方,则可以在客户端之外共享 ID 令牌。想一想您通过 ID Token 泄露敏感用户信息的场景。例如,如果 ID 令牌包含仅供客户使用的关于性别的声明。但是当您与第三方共享 ID Token 时,您会暴露那些敏感信息。如果存在法律障碍,这可能是犯罪行为。

另一点是关于 ID 令牌验证。因此 ID Token 以客户为目标,重要的声明,如 aud 被相应地设置。当您将 ID 令牌传递给要使用的后端时,此类验证可能会失败。

有两种解决方案。首先是使用自包含访问令牌。如今,使用基于 JWT 的访问令牌很常见。有了它们,您将获得相同的解决方案。它将包含最终用户身份、范围值以及令牌验证信息。 Azure AD 使用这种方法 - check this link。

第二个是使用ID Token。鉴于您同时控制前端和后端,我认为您可以使用它。但请注意未来的扩展。特别是不要将其暴露给其他方。

【讨论】:

谢谢。我最终使用了您的第一个解决方案(使用基于 JWT 的访问令牌)。 oauth2-server-php 支持使用基于 JWT 的访问令牌。

以上是关于在 OpenID Connect 中,是不是可以将 id 令牌而不是访问令牌传递给资源服务器进行授权?的主要内容,如果未能解决你的问题,请参考以下文章

@EnableOAuth2Sso 注释 OpenID Connect 是不是兼容?

OpenID-Connect 身份验证服务器的登录页面中是不是需要 CSRF 令牌?

OpenID Connect:使用 response_type 令牌请求范围 openid 是不是错误

IdentityServer:检查 OpenId Connect 中的身份验证策略中是不是存在范围

OpenId Connect 身份验证属性

如何确定用户是不是仍在使用 PingFederate OpenID Connect 隐式客户端流登录?