JWT 的验证如何区分令牌类型之间的差异?

问题描述

我正在尝试构建自定义 Oauth2/OpenID 库,并且正在考虑验证令牌。

我只将 JWT 用于所有令牌类型(访问、刷新和 ID),但我在想;资源服务器将如何验证 ex。访问令牌,并确保它只是来自被接受的颁发者的访问令牌,而不是刷新或 ID 令牌,因为它们也是有效的,因此它们来自同一个受信任的颁发者?

同样,如何确保通过刷新授权发送的令牌不仅仅是有效的访问令牌,因为它也将被验证......

我知道一个简单的解决方法就是创建一个自定义声明,描述它是什么类型的令牌,或者为每个令牌使用不同的签名,但是有没有“正确”的方法来做到这一点?

解决方法

将 ID 令牌与访问令牌分开的一种方法是查看 JWT-header 中的 typ 声明。

某些 IdentityProvider 使用 at+jwt typ 来表示令牌是遵循某些规则的访问令牌。但这不是必须遵守的事情。

{
  "typ":"at+JWT","alg":"RS256","kid":"RjEwOwOA"
}

否则,他们可以查看令牌内的声明,以确定它是访问令牌还是 ID 令牌。令牌签名本身不能用于确定令牌类型。

您可以阅读更多关于访问令牌标准 herehere

Refreshreference 令牌通常不是 JWT 格式,而是更像是随机字符串。