SSO实现过程

一、SSO认证过程

OIDC流程

1、用户在浏览器输入第三方应用地址,第三方应用(RP)前端发送认证请求到认证服务方(OP) ---由前端服务发起
2、用户在认证页面进行认证与选择授权内容 ---用户参与
3、认证服务方(OP)对认证请求进行验证,发送Id token及Access token给第三方应用(RP)
4、第三方应用可使用Access token请求用户信息或其他授权内的资源
5、资源服务对Access token校验并返回用户信息或资源

这是一个整体的OIDC流程,接下来对该流程进行详细说明。

二、详细逻辑

前端采用插件oidc-client.js。对oidc-client.js封装后,生成mgr对象,下文中mgr就是封装后的oidc-client对象。

2.1、oidc-client.js的作用
SignInRedirect:发起重定向;
SignInCallback:登录成功需要调用的回函数调,作用是用code换取token,有code无token才调用;
SignOutCallback:路由到logout时调用;

2.2、认证全流程
【核心逻辑】
1、登录前判断token无效则跳转到登录页面(mgr.signInRedirect,auth/authorize)。
浏览器中访问第三方应用,第三方应用的前端路由守卫中,会判断有没有access token和code。此时没有token没有code,则调用mgr.signInRedirect(RP_URL)发起重定向,这个方法实际上就是调用后端认证中心的接口auth/authorize,auth/authorize接口通过校验cookie中的Authentication不存在,从而从后端发起重定向到登录页面(后端会提前配置登录页面地址,方便此刻的重定向),登录完成后set cookie;(对应“图2-OIDC总体流程”的1-5步)
2、登录成功后重定向到RP页面,PR通过code换取access token。(window.location.replace(认证地址+auth/location))。
登录成功的前端回调函数(对应“图1-登录成功回调函数”)中,会先加载iframe(ifr.src=认证地址+"/auth/check_session"),然后监听到iframe发送的ok消息后,则发起重定向请求(代码为:window.location.replace(认证地址+auth/location?code&account&sid&state&redirectUrl)),也就是通过调用认证中心的“auth/location”接口,达到从后端发起重定向到RP地址的目的,并在重定向的地址后返回code如:"?code=1234qeerer";(对应“图2-OIDC总体流程”的6-7步)

图1-登录成功回调函数.jpg

3、RP应用内部通过code换取token(mgr.signInCallback,/token)。
此时浏览器地址已经切换到RP前端。同第1步一样,RP前端路由守卫,会判断access token和code。此时有code没有token(因为access token区分应用,也就是说,每个应用的access token是独立的,所以登录后首次访问RP还是没有access token),则RP前端调用mgr.signInCallback()方法,向后端发起/token请求,意在用code换取access token,成功后,该方法的回调中则可以将路由正常走下去。(对应“图2-OIDC总体流程”中的8-9步)
4、第三方通过跳转到SSO的登录页面登录成功后,再跳回第三方页面,这个过程,从第三方应用角度来看,只是访问地址url中多了后面的一个code参数。第三方应用拿着code再去换取token,这样第三方就获得了accessToken。所以,第三方跳转到SSO的登录页面去完成登录,只是为了获取code,然后回到自己页面得再用code换取token,code是第三方服务和SSO服务之间的桥梁和唯一联系,也是SSO的关键点,记住这一点就容易理解SSO了。

图2-OIDC总体流程.png

参数解析如下:
1、步骤2中,客户端提供以下参数请求Authorization Server:
response_type:必选。值固定为“code”。
client_id:必选。第三方应用的标识ID。
state:推荐。Client提供的一个字符串,服务器会原样返回给Client。
redirect_uri:必选。授权成功后的重定向地址。
scope:可选。表示授权范围。
2、步骤4会返回如下信息:
code:授权码。
state:步骤2中客户端提供的state参数原样返回。
3、步骤9中客户端需要提供的参数如下:
grant_type:必选。固定值“authorization_code”。
code : 必选。Authorization Response 中响应的code。
redirect_uri:必选。必须和Authorization Request中提供的redirect_uri相同。
client_id:必选。必须和Authorization Request中提供的client_id相同。
4、步骤9的响应信息如下:
access_token:访问令牌。
refresh_token:刷新令牌。
expires_in:过期时间。

2.3、认证子流程-登录
上图中的4、5、6、7步骤,就是登录子流程,登录子流程详细流程图如下图所示。

图3-OIDC登录流程.png

登录成功后
1. 前端通过iframe将localstorage传递并存储到OP域名下,对应6和7;
2. 前端发起重定向请求,后台启动重定向到第三方页面,对应8和9;
3. 第三方应用(RP)通过code来请求认证服务方的Token EndPoint换取Token(OIDC-client.js自主完成);
4、iframe的作用是保留统一的sid,也就是oidc中的id token(用于第三方应用标识用户身份)(sid=id token,这个理解有待核实)。sid在用户登录一次后,就被存储下来。在其中一个应用登录的情况下访问第二个应用时,则无需再次登录,只需用已经存储的sid换取code,应用再用code换取自己的accessToken。所以iframe中的html代码逻辑,最重要的是要将sid存储到localStorage中。见“图4-iframe加载的html代码内容.jpg”中的48行中。

图4-iframe加载的html代码内容.jpg

id token用来标识用户身份,说明此刻访问的用户(人)是谁;access token用来标识应用身份,说明此刻访问数据的是哪个RP。

有关id token的内容可以参考链接:理解OIDC协议和认证机制 (shuzhiduo.com)

2.4、OIDC 会话管理

三、后端代码

省略

结合以下链接理解:

[认证 & 授权] 1. OAuth2授权 - Timetombs - 博客园 (cnblogs.com)
[认证 & 授权] - 随笔分类 - Timetombs - 博客园 (cnblogs.com)

Session管理: OpenID Connect Session Management 1.0
OpenID Connect官网 | OpenID

你可能感兴趣的:(SSO实现过程)