前言
OAuth2
官网:https://oauth.net/2/
OIDC:Open ID Connect
官网:http://openid.net/connect/
What is OpenID Connect?
OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.
OpenID Connect allows clients of all types, including Web-based, mobile, and JavaScript clients, to request and receive information about authenticated sessions and end-users. The specification suite is extensible, allowing participants to use optional features such as encryption of identity data, discovery of OpenID Providers, and session management, when it makes sense for them.
大致意思就是openid connect1.0是oauth2.0协议之上的一个简单的身份层;
为什么要使用idToken?
jwt的payload部分,一般包含7个默认字段信息(还不了解jwt的建议先在官网了解jwt的结构):
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
除以上默认字段外,我们还可以自定义私有字段,如下例:
大家都知道oauth2协议,会签发jwt形式的access token,用于接口请求的凭证;
笔者之前在做oauth2集成的时候一直在想,已经有了jwt签名的access token,为什么还需要idToken呢?
我刚开始有这样的疑问,有三个原因:
1.jwt的payload部分包含了丰富的信息,且还可以自定义私有字段,在自定义私有字段时候,将username等用户信息参数签发进来,不就满足了用户身份信息认证?
2.jwt有签名防篡改的能力,将username等用户信息签发到payload不会有篡改风险;
3.已经有access token的情况下,idToken显得多余;
后来在集成微软的azure oauth2登录的时候,终于Get到了idToken的优势,那么为什么要用idToken呢?
在我看来有以下原因:
1.在access token添加用户身份信息,可能导致用户信息泄露;
因为每次接口请求都携带access token,其payload部分的用户信息是可解析的,相当于是明文的;
2.access token目的是用于接口访问的凭证,如果同时包含用户信息的话,功能就不分离了;
3.使用idToken替换userinfo endpoint获取用户信息;
就像微软官方doc也提到:
一般oauth2协议,都提供userinfo endpoint获取用户信息,例微软:https://graph.microsoft.com/oidc/userinfo,使用access token调用此接口获取得到用户信息;idToken可节省调用userinfo API接口的额外消耗;
4.某些场景,如只需要用户登录认证并获取用户信息,而不必调用Resource Server的其他API;那么这种场景只需要返回idToken,accessToken将不必返回;
例如微软提到的sign-in request
Send the sign-in request
综上可知,idToken的优势就体现到了。
需要补充说明一点的是,idToken只用于用户身份信息认证,并不能用户接口调用的凭证,设计的系统的时候一定要区分开;
另外网上一些关于OIDC的解释,我觉得是有歧义的:
OIDC是基于OAuth2的,OAuth2只解决了授权的问题,没有解决认证问题,而OpenID是个认证协议,所以二者结合就是OIDC。
我认为:OAuth2应该是同时解决了认证和授权的问题,以为OAuth2登录,用户在第三方平台登录的时候,不管是输入凭证的方式,还是选择已登录account的方式,这个步骤就是认证的过程;
然后用户也一并授权了能访问用户的信息,如头像,昵称等,并签发了access token,这个步骤是授权;
OIDC= OAuth2 + OpenID
我认为:OIDC并不一定OAuth2 + OpenID,如果是access token和idToken一并签发,这种场景是可以这么理解;但是像微软提到的sign-in request,这类场景仅单纯返回idToken,就不能这么认为了;
OIDC在OAuth2的access_token的基础上增加了身份认证信息, 通过公钥私钥配合校验获取身份等其他信息—– 即idToken