OIDC中的Id token和OAuth2.0中核心的Access token各自效力或是关注的部分不同。
- OAuth2提供了Access Token来解决授权第三方应用访问受保护资源的问题;
- OIDC遵循OAuth2.0协议流程在这个基础上提供了ID Token来解决第三方应用标识用户身份的问题。
OIDC的流程主要由以下5个步骤构成:
- 第三方应用(RP)发送认证请求到认证服务方(OP)
- 用户在认证页面进行认证与选择授权内容
- 认证服务方(OP)对认证请求进行验证,发送Id token及Access token给第三方应用(RP)
- 第三方应用可使用Access token请求用户信息或其他授权内的资源
- 资源服务对Access token校验并返回用户信息或资源
流程上,在OAuth2.0中授权码模式和隐式授权模式下,OIDC和OAuth2.0是一样的,但有几个授权模式在某些情况下,在OIDC中就不存在了,当用户无需经过身份认证过程即可获得Access token,比如如下两种模式。
- 资源所有者密码凭证授权(Resource Owner Password Credentials Grant):第三方应用能够获取到用户的登录凭证就直接可以向授权服务器请求Access token,如此,就去掉了标识用户身份这一过程了。
- 客户端凭证授权(Client Credentials Grant):这种是标识客户端,直接的参与者人都没有加入到流程中,也不存在标识用户是谁了。
OIDC的认证流程主要是由OAuth2的几种授权流程延伸而来的,主要有以下3种:
- 授权码流程(Authorization Code Flow):基于OAuth2的授权码流程,在原来code换取Access token的基础上增加了一个Id token。
- 隐式流程(Implicit Flow):基于OAuth2的隐式流程,在原来从授权服务器重定向到第三方应用仅返回Access token的基础上增加了一个Id token。
- 混合流程(Hybrid Flow):混合了授权码流程(Authorization Code Flow)和隐式流程(Implici Flow),能够按照参数配置的不同,控制Id token的返回位置与Access token的有无。
注意:如上省略了Refresh token,关注于Id token和Access token。
1、第三方应用通过浏览器重定向到授权服务器(OP)的认证页面来进行用户认证与执行授权流程。重定向时使用的参数是基于OAuth2.0中的大部分参数。主要如下几个
- scope:必选。选择的授权范围,当是OIDC请求时,需要包含openid选项,如下示例所示。
- response_type:必选。响应类型方式,使用授权码流程时,为code.
- client_id:必选。第三方应用提前在授权服务器处注册得到的id值。
- redirect_uri:必选。重定向到OP认证授权完毕后重定向到RP的地址。
- state:推荐。第三方应用(RP)提供的一个字符串,授权服务器(OP)会原样返回给第三方应用(RP),以阻止CSRF攻击。
如上几个是常使用到的授权码流程中所需的参数,实际上还有许多其他参数可以依照不同场景的需要使用上。其他参数信息https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest
2、当用户完成认证信息填写与执行授权操作后,授权服务器(OP)对用户认证信息的审核和授权范围的校验。有效后重定向到第三方应用(RP)指定的回调地址(第1步中的redirect_uri),将code和state参数作为查询参数附加在回调地址后。
3、第三方应用(RP)通过code来请求认证服务方的Token EndPoint换取Token。
然后Token EndPoint会返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段。
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
4、请求用户信息或授权内的资源。