问题描述
我正在尝试构建自定义 Oauth2/OpenID 库,并且正在考虑验证令牌。
我只将 JWT 用于所有令牌类型(访问、刷新和 ID),但我在想;资源服务器将如何验证 ex。访问令牌,并确保它只是来自被接受的颁发者的访问令牌,而不是刷新或 ID 令牌,因为它们也是有效的,因此它们来自同一个受信任的颁发者?
同样,如何确保通过刷新授权发送的令牌不仅仅是有效的访问令牌,因为它也将被验证......
我知道一个简单的解决方法就是创建一个自定义声明,描述它是什么类型的令牌,或者为每个令牌使用不同的签名,但是有没有“正确”的方法来做到这一点?
解决方法
将 ID 令牌与访问令牌分开的一种方法是查看 JWT-header 中的 typ 声明。
某些 IdentityProvider 使用 at+jwt typ 来表示令牌是遵循某些规则的访问令牌。但这不是必须遵守的事情。
{
"typ":"at+JWT","alg":"RS256","kid":"RjEwOwOA"
}
否则,他们可以查看令牌内的声明,以确定它是访问令牌还是 ID 令牌。令牌签名本身不能用于确定令牌类型。
您可以阅读更多关于访问令牌标准 here 和 here
Refresh 和 reference 令牌通常不是 JWT 格式,而是更像是随机字符串。