名词解释

JWT

id_token

是一个 Jwt(查找Jwt校验库:https://jwt.io/),用来验证用户的身份(没有其他用?(根据协议来说)),所以不应使用 id_token 请求API;

每个token都有一个 aud 字段,标识token是哪个(些)服务通过身份验证获取的;这意味着只有这个(些)服务,才能使用这个 token;(关于 aud,参考jwt协议)

这就是为什么那些开源软件中,每一个client对应一个服务,而且从其他配置也可以看出,比如配置服务器域名等;

但是,对于其他协议是怎么样的,比如oauth,access_token 如果也是一个 jwt,肯定也是如同上面所说,那么CAS、SAML呢?

OIDC服务需要给CS颁发公钥,让客户端自己验证 id_token 合法性,而不需要再调接口来验证;

access_token(AC)

不一定是 Jwt格式;

他的作用是授权CS(client server)访问RS(resource server)上的资源;

access_token 并不能验证用户是否已经经过身份验证(ps:身份验证也是一个独立的很大的课题);

token(jwt格式下)中只有用户ID这一个用户信息(在jwt中用sub标识)以及它被授予了哪些操作的权限;

大部分场景下,也可以使用 AC 访问 /userinfo 端点;

access_token VS id_token

access_tokenid_token
格式通常是jwt,不一定jwt
作用用作授权仅用于客户端,客户端根据公钥进行验签,认为用户认证通过,拿到其中的用户信息;
场景大多数场景,只需要AT即可目前大部分场景,不需要 id_token,需要进一步了解复杂场景,比如多因子认证、移动端(单点)登录等

结论:

一般情况下,我们并不一定需要 id_token ,它只是OIDC协议针对 oauth 协议 的其中一个补充,access_token 同样可以获取用户信息;

使用 OIDC 协议,不必只关注 id_token,更多的是使用 ”发现端口“(well-known)等;

网上的一些讨论:

https://github.com/IdentityServer/IdentityServer3/issues/2015
https://community.auth0.com/t/what-is-the-difference-between-idtoken-accesstoken/10843

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注