关于id_token vs access_token的澄清

Chr*_*sen 21 access-token oauth-2.0 openid-connect

我正在使用OIDC和OAuth 2.0(使用Auth0)构建一个系统,我不确定如何正确使用id_tokenaccess_token.或者更确切地说,我对在我的设置中分配给各种服务的角色感到困惑.

我有一个完全静态的前端应用程序(单页面应用程序,HTML + JS,没有后端),可确保使用针对Auth0的隐式流程对用户进行身份验证.然后,前端应用程序从我正在构建的API中获取数据.

现在,哪个是对的?

  • 前端SPA是OAuth 客户端应用程序
  • 我的API服务是OAuth 资源服务器

...要么:

  • 前端和我的API服务都是客户端应用程序

如果我的前端和后端API都可以被认为是客户端,我认为在id_token我的前端到后端的请求中使用持票令牌没有真正的危害- 这很有吸引力,因为那时我可以简单地验证签名后的令牌后端,我有关于我需要的用户的所有信息.但是,如果我的API被认为是资源服务器,我应该使用它access_token,但是我必须在每个API请求上连接到Auth0的服务器以验证令牌,并获得基本的用户信息,不是吗?

我已经读过这个似乎表明它access_token是我的API使用的唯一有效令牌.但就像我说的那样,我不确定个别服务的角色.并且使用它id_token很诱人,因为它在后端不需要网络连接,并且包含提取正确数据所需的信息.

什么是正确的方法?

Ogg*_*las 16

我喜欢这篇关于差异的 Medium 帖子,这一切都归功于这位作者。

https://medium.com/@nilasini/id-token-vs-access-token-17e7dd622084

如果您像我一样使用 Azure AD B2C,您可以在此处阅读更多信息:

https://learn.microsoft.com/en-us/azure/active-directory-b2c/openid-connect

身份令牌

如果您使用范围作为 openid,您将获得 id 令牌。Id 令牌特定于 openid 范围。使用 openid 范围,您可以获得 id 令牌和访问令牌。

OpenID Connect 对 OAuth 2.0 进行的主要扩展是 ID 令牌数据结构,以使最终用户能够进行身份验证。ID 令牌是一种安全令牌,其中包含有关使用客户端时授权服务器对最终用户进行身份验证的声明(声​​明是包含用户信息的名称/值对),以及可能的其他请求的声明。ID 令牌表示为 JSON Web 令牌 (JWT)

{
   "iss": "https://server.example.com",
   "sub": "24400320",
   "aud": "s6BhdRkqt3",
   "nonce": "n-0S6_WzA2Mj",
   "exp": 1311281970,
   "iat": 1311280970,
   "auth_time": 1311280969,
   "acr": "urn:mace:incommon:iap:silver"
}
Run Code Online (Sandbox Code Playgroud)

以上是默认的 JWT 声明,除此之外,如果您向服务提供商请求声明,那么您也会得到这些声明。

根据 OIDC 规范, Anid_token是 JWT。这意味着:

  • 有关用户的身份信息直接编码到令牌中,并且
  • 可以明确地验证令牌以证明它没有被篡改。

规范中有一组用于验证 id_token. 中编码的声明中有id_token一个过期时间 ( exp),必须将其作为验证过程的一部分予以遵守。此外,JWT 的签名部分与密钥配合使用,以验证整个 JWT 未被以任何方式篡改。

访问令牌

访问令牌用作不记名令牌。持有者令牌意味着持有者(持有访问令牌)无需进一步识别即可访问授权资源。因此,保护​​不记名令牌非常重要。如果我能以某种方式获得并“持有”您的访问令牌,我就可以假装成您。

为了提高安全性,这些令牌的生命周期通常很短(由其过期决定)。也就是说,当访问令牌过期时,用户必须再次进行身份验证才能获取新的访问令牌,从而限制其作为不记名令牌这一事实的暴露。

尽管 OIDC 规范没有强制要求,但 Okta 使用 JWT 来获取访问令牌,因为(除其他外)过期时间直接内置于令牌中。

OIDC 指定返回身份信息且必须受到保护的 /userinfo 端点。提供访问令牌可以使端点可访问。

http://openid.net/specs/openid-connect-core-1_0.html https://connect2id.com/learn/openid-connect#cool-id-token-uses https://developer.okta.com/博客/2017/07/25/oidc-primer-part-1


Arl*_*dua 5

您的前端是您的 OAuth 客户端应用程序,一旦它存储了令牌,它就可以对 OAuth 流程执行操作。而你的 API 服务是资源服务器,因为它接受你的身份服务器发出的 access_token。

另外我想说的是,您的 id_token 代表登录用户的身份,可能包含您的应用程序的敏感数据。access_token 是您访问资源的凭证。

最后,您将使用 access_token 来请求资源,然后如果您需要来自登录用户(资源所有者)的特定数据,您可以从令牌端点请求 ID 令牌。