ID令牌和访问令牌有啥区别,以及如何使用JWT实现它们?

Posted

技术标签:

【中文标题】ID令牌和访问令牌有啥区别,以及如何使用JWT实现它们?【英文标题】:What is the difference between ID token and access token, and how to implment them using JWT?ID令牌和访问令牌有什么区别,以及如何使用JWT实现它们? 【发布时间】:2021-10-17 23:52:57 【问题描述】:

所以我一直在阅读 ID 令牌和访问令牌之间的区别是用于授权。不知道怎么实现ID token,应该是JWT。

我一直在实现的访问令牌如下所示:

const accountCredentials = 
    username: account.username,
    accountId: account.accountId,
    grant_type: "password"


const token = jwt.sign(accountCredentials, config.JWT_KEY,  expiresIn: "1h" )

所以我想知道,ID 令牌应该包含什么以及如何按照 openID 连接规范的描述来实现它。对不起,这听起来可能很愚蠢,但我真的不明白文档。

【问题讨论】:

【参考方案1】:

ID 令牌是允许您的应用识别用户的令牌。它始终是 JWT,其内容在 OIDC 文档的本节中进行了描述:https://openid.net/specs/openid-connect-core-1_0.html#IDToken 因此,要拥有有效的 ID 令牌,您需要一个至少包含以下声明的 JWT:isssubaudexpiat。您可以在规范中查看每个声明应包含的内容。此外,ID 令牌必须至少经过签名(也可以加密)。

在您的代码中,您将拥有类似的内容:

const accountCredentials = 
    iss: '...',
    sub: account.username,
    aud: '...',
    iat: now()


const token = jwt.sign(accountCredentials, config.JWT_KEY,  expiresIn: "1h" )

请注意,OpenID Connect 规范仅指定授权代码、隐式和混合流。使用密码授权类型不是 OIDC 标准的一部分。

【讨论】:

以上是关于ID令牌和访问令牌有啥区别,以及如何使用JWT实现它们?的主要内容,如果未能解决你的问题,请参考以下文章

具有长 TTL 的引用令牌和刷新令牌+短寿命 JWT 有啥区别?

当我想使 JWT 令牌无效时,JWT 和 session-cookie 有啥区别?

JWT 刷新令牌必须有啥声明?它可以与访问令牌相同(具有更长的exp)吗?

Webapi 2.0如何在访问令牌过期时实现刷新JWT令牌

在哪里存储访问令牌以及如何跟踪用户(在 Http only cookie 中使用 JWT 令牌)

如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?