名词解释
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_token | id_token | |
---|---|---|
格式 | 通常是jwt,不一定 | jwt |
作用 | 用作授权 | 仅用于客户端,客户端根据公钥进行验签,认为用户认证通过,拿到其中的用户信息; |
场景 | 大多数场景,只需要AT即可 | 目前大部分场景,不需要 id_token,需要进一步了解复杂场景,比如多因子认证、移动端(单点)登录等 |
结论:
一般情况下,我们并不一定需要 id_token ,它只是OIDC协议针对 oauth 协议 的其中一个补充,access_token 同样可以获取用户信息;
使用 OIDC 协议,不必只关注 id_token,更多的是使用 ”发现端口“(well-known)等;
网上的一些讨论: