OAuth 2 access_token vs OpenId Connect id_token

Posted

技术标签:

【中文标题】OAuth 2 access_token vs OpenId Connect id_token【英文标题】: 【发布时间】:2013-10-18 02:19:12 【问题描述】:

虽然我之前使用过 OAuth 2,但我还是 Open ID Connect 的新手。

阅读教程和文档,我遇到了 access_tokenid_token 其中 access_token 是根据 OAuth 2 生成的随机唯一字符串,并且id_token 是 JSON Web Token,其中包含用户 id、算法、发行者等信息以及可用于验证它的各种其他信息。我还看到提供 access_token 和 id_token 的 API 提供商,据我所知,这是为了向后兼容。

我的问题是是否可以同时使用 access_token 和 id_token 来访问受保护的资源?还是 id_token 仅用于验证目的而 access_token 用于获取对受保护资源的访问权限?

【问题讨论】:

请注意,access_token 通常是一个随机数,而 id_token 包含一些关于用户的私人信息:它的姓名、电子邮件,可能还有其他一些信息。因此,在整个系统中广泛使用 id_token 并不是一个好主意,因为它可能会泄漏,例如打印到日志或显示在错误页面等上。 【参考方案1】:

最初,OAuth 和 OpenId 是为不同的目的而设计的:OpenId 用于身份验证,OAuth 用于授权。 OpenId Connect 是两者的统一,为两者服务,但不会改变它们的原始功能。记住这一点,你应该能够找到自己。 ;-)

id_token 用于识别经过身份验证的用户,例如对于 SSO。 access_token 必须用于证明对受保护资源的访问权限,例如用于 OpenId Connect 中的 userinfo 端点。

【讨论】:

我对这个 open id connect 和 oauth2 实现有点困惑。我有一个前端(html,angularjs)和后端 web 服务。现在我想在登录期间实现基于令牌的机制,所以登录用户将发送客户端 ID、电子邮件 ID、密码,然后在后端我将验证客户端 ID 其他凭据,然后我将向用户发出令牌,并在该令牌的帮助下,用户将维护该用户会话。那么 openid 连接来自哪里以及如何这对我很有用。请您给我一些见解,因为我在这里真的很困惑 据我了解,您不需要授权,只需要身份验证。如果是这样,那么您应该只使用 OpenId 或 SSO 解决方案,但您根本不需要 OAuth 或 OpenId Connect。 @ZólyomiIstván,对于 SPA,看起来它使用 'id_token' 代替了 'access_token'。 'id_token' 在这种特殊情况下接管 SPA 是真的吗?一个原因是,SPA 由于 CORS 策略而无法与 OAuth 令牌端点通信。【参考方案2】:

另一个角度提供答案:

id_token

id_token 是 JWT - 请注意这一点! 它包含有关用户/资源所有者身份的声明 拥有有效的 id_token 意味着用户已通过身份验证

access_token

access_token 是不记名令牌 不记名令牌意味着不记名可以访问资源而无需进一步识别 access_token 可以是 JWT(请参阅附录点 1。)或不透明

如果你想了解更多:Types of tokens in oidc and oauth

【讨论】:

【参考方案3】:

access_token 可用于调用 Auth0 中的某些 API(例如 /userinfo)或您在 Auth0 中定义的 API。

id_token 是一个 JWT,代表已登录的用户。它经常被您的应用使用。

是否可以同时使用 access_token 和 id_token 访问受保护的资源 ?

不完全,首先需要使用id_token登录, 第二,你会得到一个accessToken, 最后,使用accessToken访问数据。

【讨论】:

对于 SPA,看起来它使用 'id_token' 代替了 'access_token'。 'id_token' 在这种特殊情况下接管 SPA 是真的吗?一个原因是,SPA 由于 CORS 策略而无法与 OAuth 令牌端点通信。【参考方案4】:

这里有一篇文章描述了为什么要引入 id_token 以及它的最初目的是什么:Why we need a id_token in OpenID Connect & Facebook Connect。简而言之,他们试图标准化 Facebook 使用的Hybrid Flow。

我们考虑使用 id_token 作为 access_token。 我们拒绝了该选项,因为:

许多提供商都有现有的 OAuth 令牌格式用于难以更改的端点。 我们不希望将长期访问令牌作为 cookie 存储在浏览器中。 两个令牌的接收者明显不同,从长远来看,这两个令牌的语义过载会降低灵活性并增加复杂性。

【讨论】:

以上是关于OAuth 2 access_token vs OpenId Connect id_token的主要内容,如果未能解决你的问题,请参考以下文章

既生瑜何生亮 access_token VS refresh_token

KeyError: 'access_token' 在 OAuth 2.0 身份验证期间使用 Spotify API

OAuth 2.0 范围参数与 OAuth 2.0 JWT access_token 范围声明

配置 Spring Security 5 Oauth 2 以使用 access_token uri 参数

我在哪里可以检查 google oauth 2.0 access_token 是不是有效?

OAuth 修改access_token的存储位置