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:iss
,
sub
、aud
、exp
、iat
。您可以在规范中查看每个声明应包含的内容。此外,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)吗?