记录 SpringBoot+Shiro+JWT+Pac4j Oidc前端分离接入一体化中心实现单点登录与注销

一.情况说明:

前后端分离项目,前端Vue.js,后端SpringBoot.作为业务系统,需要接入甲方客户的一体化用户统一认证中心平台(基于OpenID Connect 1.0标准协议实现的单点登录服务)实现单点登录与注销.

二.一体化认证文档说明:

标识提供程序(一体化用户中心)为身份认证服务及权限控制服务提供用户及组织架构基础数据,它通过组织架构同步服务直接与人力资源系统对接,始终保持与人力资源系统的数据同步性。除一体化平台本身使用之外,它还通过 RestFull API 的方式为院内所有其他系统提供统一的用户及组织架构数据服务,降低各个业务系统对人力资源系统的数据依赖,实现统一标准化的组织架构数据。

身份认证服务基于国际通用标准 OpenID Connect 1.0 协议(以下简称OIDC)实现,它允许开发人员验证跨网站和应用的用户,而无需拥有和管理用户的密码。OIDC是一个基于OAuth2.0协议的身份认证标准协议,它使用OAuth2.0的授权服务器来为第三方客户端提供用户的身份认证,并将对应的身份认证信息传递给客户端,并且可以适用于各种类型的客户端(如服务端应用、移动APP以及JS应用等),它完全兼容OAuth2.0,因此一体化身份认证服务器同时也可以当成OAuth2.0服务器来使用。

2.1 身份认证服务

身份认证服务是基于OpenID Connect 1.0 协议(以下简称OIDC)实现的用于识别并认证用户身份的服务,它允许开发人员验证跨网站和应用的用户,而无需拥有和管理用户的密码。OIDC是一个基于OAuth2.0协议的身份认证标准协议,它使用OAuth2.0的授权服务器来为第三方客户端提供用户的身份认证,并将对应的身份认证信息传递给客户端,并且可以适用于各种类型的客户端(如服务端应用、移动APP以及JS应用等),它完全兼容OAuth2.0,因此一体化平台中的身份认证服务器同时也可以当成OAuth2.0访问授权服务器来使用。

2.2 身份认证两种业务场景

用户访问某个业务系统:用户访问业务系统指的是设计院的员工以个人身份登录业务系统并以个人身份执行系统中的某此业务操作,系统要知道的不仅仅是员工能不能访问系统,而且要明确知道是谁在访问系统。因此,在此业务场景下,必须通过OIDC协议进行身份认证,用户在访问业务系统时携带由身份认证服务颁发的Id Token,业务系统据此Id Token完成用户身份的识别。通常情况下,我们称此业务场景为单点登录。

系统访问另外一个业务系统:系统访问另外一个业务系统指的是各业务系统之间的业务集成,经过授权的系统是仅允许其完全访问特定的API,这类业务场景完全是系统与系统之间的交互,不涉及到具体员工的参与,因此无需明确的员工身份信息,假使某个业务操作需要指明由某个用户处理,它也应该通过业务接口参数而不是Token的方式传递。对于此类业务场景,仅需要通过OAuth2.0协议进行客户端的身份授权即可,系统在访问另外一个系统时携带由授权服务器(与身份认证服务器为同一服务器)颁发的Access Token,目标业务系统据此Access Token完成访客业务系统的授权识别。通常情况下,我们称此业务场景为访问授权。

2.3 单点登录

单点登录用于实现用户访问某个业务系统时的身份识别,同时也可以实现用户在一处登录即可访问院内所有系统的便捷功能,相对应的单点登录服务也实现了用户在一处注销即在所有系统注销的功能。
根据OIDC协议的定义,单点登录的步骤如下(假定用户没有登录):
1.用户访问业务系统A中受保护的页面/API
2.业务系统A检测到用户没有登录,重定向到单点登录网站(地址:https://sso.gmdi.cn)
3.用户输入用户名及密码,验证通过后重定向到业务系统A在单点登录服务中注册的回调地址并携带access_token、id_token等信息
4.业务系统A携带access_token请求单点登录服务用户信息API(地址:https://acs.gmdi.cn/connect/userinfo),解析单点登录服务返回的详细用户信息并进行本地登录(这一步主要针对现有系统)
5.用户访问业务系统B中受保护的页面/API
6.业务系统B向单点登录服务发送认证请求
7.单点登录服务发现用户已认证,重定向到业务系统B在单点登录服务中注册的回调地址并携带access_token、id_token等信息
8.业务系统B携带access_token请求单点登录服务用户信息API,解析单点登录服务返回的详细用户信息并进行本地登录(这一步主要针对现有系统)
9.用户完成跨系统的访问

2.4 单点注销

1.用户在业务系统A中请求注销,业务系统A请求单点登录服务的注销API(地址:https://acs.gmdi.cn/connect/logout)
2.单点登录服务请求所有业务系统在单点登录服务中注册的注销回调地址
3.各业务系统在收到单点登录服务的注销回调请求后清除本地存储的access_token及id_token等信息,并执行本地注销
4.业务系统A清除本地存储的access_token及id_token等信息,并执行本地注销
5.完成跨系统注销

2.5 访问授权

访问授权与单点登录使用的是同一身份认证服务器,在授权流程上使用oauth2.0协议中的客户端模式(client credentials),由信息中心为待接入的客户端分配客户端标识(client_id)、客户端密钥(client_secret)以及可访问的API范围(scope)。
根据oauth2.0协议关于客户端模式(client credentials)的定义,访问授权的步骤如下:
1.向信息中心申请client_id、client_secret以及scope;
2.信息中心分配client_id、client_secret以及scope;
3.客户端应用携带client_id、client_secret以及scope向访问控制服务请求access_token;
4.客户端应用存储访问控制服务响应的token_type、access_token以及expires_in;
5.客户端应用携带access_token请求具体的业务API,在每次请求业务API之前需要先检查access_token是否已过期,如果过期则跳转到步骤2请求新的access_token;
6.客户端应用完成业务API的访问。

2.6 流程图
记录 SpringBoot+Shiro+JWT+Pac4j Oidc前端分离接入一体化中心实现单点登录与注销_第1张图片

三.具体实现逻辑

3.1 登录

1.前端请求需要登录才能访问的后端接口
2.后端拦截请求,判断请求头是否携带有token,没有则直接返回401,有token则验证token合法性,验证失败返回402
3.前端接收到401或402,直接重定向到后端写好的用于跳转到一体化中心登录页面的接口,并传递redirectUrl=用户当前访问的前端页面地址(用于登录成功后重定向回该页面)
4.后端收到前端的登录请求,保存redirectUrl到session然后重定向到一体化中心登录页面
5.用户输入用户名和密码进行登录
6.登录成功后一体化中心会请求提前注册好的登录成功回调接口
7.在登录回调接口获取登录用户的信息,保存用户信息到自身业务系统的用户表中,并根据用户信息生成token
8.携带token重定向到4步骤保存的redirectUrl页面
9.前端获取到登录的token,保存到local Storage,下次访问时在请求头加上token进行访问

3.2注销

1.前端访问后端注销接口,在接口中重定向到一体化中央注销
2.一体化中心收到中央注销请求,访问各业务系统提前注册好的注销回调地址
3.在注销回调接口里进行本地session数据销毁并使token失效(生成token时加上一个版本号,版本号与用户对应保存到redis,注销时版本号加1)

你可能感兴趣的:(记录 SpringBoot+Shiro+JWT+Pac4j Oidc前端分离接入一体化中心实现单点登录与注销)