虽然我以前使用过 OAuth 2,但我是 Open ID Connect 的新手。
阅读教程和文档时,我遇到了access_token和id_token,其中access_token是根据OAuth 2生成的随机唯一字符串,id_token是JSON Web令牌,其中包含用户ID等信息,算法、发行者和可用于验证它的各种其他信息。我还看到 API 提供商同时提供 access_token 和 id_token,据我所知,这是为了向后兼容。
我的问题是是否可以同时使用access_token和id_token来访问受保护的资源?或者 id_token 仅用于验证目的,而 access_token 用于获取对受保护资源的访问权限?
最初,OAuth 和 OpenId 的设计目的不同:OpenId 用于身份验证,OAuth 用于授权。 OpenId Connect 是两者的统一,为两者服务,但不改变它们原有的功能。记住这一点,您应该能够自己找到答案。 ;-)
id_token 用于识别经过身份验证的用户,例如用于单点登录。 access_token 必须用于证明对受保护资源的访问权限,例如对于 OpenId Connect 中的 userinfo 端点。
另一个角度提供答案:
如果您想了解更多信息:oidc 和 oauth 中的令牌类型
access_token对于调用Auth0中的某些API(例如/userinfo)或您在Auth0中定义的API非常有用。
id_token是一个JWT,代表登录的用户。您的应用程序经常使用它。
是否可以同时使用 access_token 和 id_token 访问受保护的资源 ?
不完全,首先需要使用id_token登录,
其次,你会得到一个accessToken,
最后,使用accessToken来访问数据。
OAuth 2 access_token VS OpenId Connect id_token
让我尝试以更具可比性的方式回答。
方面 | OAuth 2.0 访问令牌 | OpenID 连接 id_token |
---|---|---|
目的 | 访问受保护的资源 | 代表用户认证信息 |
发行 | 主要代币 | 与access_token一起发行 |
观众 | 资源服务器 | 客户端应用程序 |
格式 | 通常对客户不透明 | 可由客户端解析(通常是 JWT) |
寿命 | 可以更长寿 | 有效期通常较短 |
安全 | 主要依赖于 TLS | 由身份提供商的密钥签名 |
内容 | 可能不包含用户信息 | 包含身份验证和用户声明 |
使用方法 | 即使在用户离开后也能访问资源 | 代表单一认证事件 |
外用 | 传递给外部服务 | 未传递给外部服务 |
附加功能 | 不适用 | 可以包含c_hash和at_hash |
我希望这能更好地帮助你!
这里有一篇文章描述了为什么引入 id_token 以及它的最初目的是什么:为什么我们在 OpenID Connect 和 Facebook Connect 中需要 id_token。简而言之,他们试图标准化 Facebook 使用的Hybrid Flow。
我们考虑使用 id_token 作为 access_token。 我们拒绝了这个选项,因为:
- 许多提供商都为端点提供了现有的 OAuth 令牌格式,这些格式很难更改。
- 我们不希望长期访问令牌作为 cookie 存储在浏览器中。
- 这两个令牌显然有不同的接收者,从长远来看,这两个令牌的语义超载会降低灵活性并增加复杂性。