# 应用系统集成到统一认证服务
# 流程介绍
单点登录集成由hos统一认证提供接口服务,采用标准的OAuth2.0协议
应用系统使用OAuth2登录流程:
应用系统接入OAuth2流程:
# 应用系统集成--基于HOS开发的系统
提示
如果应用系统不是基于HOS基础平台开发的,请参考下一章节【应用系统集成--普通BS应用系统】 以下面的ip和端口为例介绍配置,实际地址需要根据项目实际环境来修改。
统一认证配置访问地址:http://114.251.235.4:8228;
统一认证服务前端ip和端口地址:http://114.251.235.4:8229;
统一认证服务后端ip和端口地址:http://114.251.235.4:8269;
OA应用的前端地址:http://192.168.101.100:8111;
本文档以此端口+ip为例,搭建项目根据实际情况进行修改
# 第一步,注册系统
统一认证配置访问地址:http://114.251.235.4:8228
接下来以OA系统为例,在统一认证配置平台,配置OA系统;
1.1 新增应用系统,OA系统
2. 进入【应用中心】->【应用管理】
2.1 认证基本信息;
注册成功应用系统后,选择应用进入应用详情页面
2.2 配置应用系统回调地址
提示
回调地址(redirect_uri)是OAuth2接入流程中,OA系统接收授权码和state参数用到;后续的操作中关键参数之一。
回调地址(redirect_uri):http://192.168.101.100:8111/oauth/redirect/hos
选择应用功能--->认证管理,配置OA系统的回调地址,默认配置一样
2.3 配置OAuth2参数
提示
客户端id(client_id)和客户端秘钥(client_secret),是自动生成的两个参数,这两个参数是后续调用接口操作中的关键参数。
2.4 下一步需要用到的参数
提示
客户端id(client_id):19sexv587l02
客户端秘钥(client_secret):i0Yg8w6X7BU4
回调地址(redirect_uri):http://192.168.101.100:8111/oauth/redirect/hos
# 第二步,接入的应用系统前端配置
1. 打开需要修改的文件
提示
开发环境修改.env.development文件; 生产环境修改.env.production文件。文件位置如下图所示
2. 修改或增加文件内容
# 登录类型(form:表单登录 \oauth:单点登录)---配置为oauth
VUE_APP_LOGIN_TYPE = 'oauth'
# 统一登录平台的编码---固定配置hos
VUE_APP_LOGIN_SOURCE = 'hos'
# 统一认证服务前端地址---把ip、端口改为实际的统一认证前端ip和端口
VUE_APP_LOGIN_OAUTH_SERVER_URL = 'http://114.251.235.4:8229/oauth/logout'
# 第三步,接入的应用系统后端配置
1. 打开需要修改的文件
提示
根据实际环境修改对应的yml配置文件; 以开发环境配置文件application-dev.yml文件为例介绍;文件位置如下图所示
2. 修改或增加文件内容
提示
以下面的ip和端口为例介绍配置,实际地址需要根据项目实际环境来修改。
统一认证服务前端ip和端口地址:http://114.251.235.4:8229;
统一认证服务后端ip和端口地址:http://114.251.235.4:8269;
OA应用的前端地址:http://192.168.101.100:8111;
#hos统一认证配置
social:
#hos统一认证地址
hos:
# 请求授权码接口,统一认证服务前端路径(根据实际场景替换该ip和端口)
codeUrl: http://114.251.235.4:8229/oauth/authorize
# 获取token接口,统一认证服务后端路径(根据实际场景替换该ip和端口)
tokenUrl: http://114.251.235.4:8269/api/oauth/token
# 获取用户认证信息接口,统一认证后端路径(根据实际场景替换该ip和端口)
userUrl: http://114.251.235.4:8269/api/oauth/resource/getUserInfo
#默认
enabled: true
#默认
userControl: false
#本应用前端ip地址(OA应用的前端地址,根据实际场景替换该ip和端口)
domain: http://192.168.101.100:8111
oauth:
# hos统一认证平台code标识
HOS:
#第一步注册应用时,生成的客户端ID(根据实际场景替换为自己的id)
client-id: 19sexv587l02
#第一步注册应用时,生成的客户端秘钥(根据实际场景替换为自己的秘钥)
client-secret: i0Yg8w6X7BU4
#第一步注册应用时必须包含本地址,${social.domain}表示的是上面配置的{本应用前端ip地址};
#也可以配置成http://192.168.101.100:8111/oauth/redirect/hos(OA应用的前端地址,根据实际场景替换该ip和端口)
redirect-uri: ${social.domain}/oauth/redirect/hos
# 第四步,集成完成,测试
1. 访问OA系统地址,http://192.168.101.100:8111 会跳转到统一认证服务登录页面
http:/login/login?redirect=%2Foauth%2Fauthorize%3Fresponse_type%3Dcode%26client_id%3D5dLgvm42d75O%26redirect_uri%3Dhttp%253A%252F%252F192.168.101.100%253A8111%252Foauth%252Fredirect%252Fhos%26state%3D6d4f2118698b7f3f3814782eb4c366d1%26scope%3D
2. 输入统一认证用户名和密码,会进入OA系统
提示
登录成功之后,进入的是OA系统的页面
# 应用系统集成--普通BS应用系统
提示
该章节介绍的是普通BS应用系统使用OAuth2协议对接的流程接入样例;如果是hos基础平台下开发的应用,参考上一章【应用系统集成--基于hos组织权限平台框架开发的系统】节接入。 下面以OA系统为例,介绍接入OAuth2的过程;实际接入中,改为实际的ip地址。
统一认证配置访问地址:http://114.251.235.4:8228;
统一认证服务前端ip和端口地址:http://114.251.235.4:8229;
统一认证服务后端ip和端口地址:http://114.251.235.4:8269;
OA应用的前端地址:http://192.168.101.100:8111;
本文档以此端口+ip为例,搭建项目根据实际情况进行修改
# 第一步,注册系统
统一认证配置访问地址:http://114.251.235.4:8228
接下来以OA系统为例,在统一认证配置平台,配置OA系统;
1.1 新增应用系统,OA系统
2. 进入【应用中心】->【应用管理】
2.1 配置认证基本信息;
注册成功应用系统后,选择应用进入应用详情页面
2.2 配置应用系统回调地址
提示
回调地址(redirect_uri)是OAuth2接入流程中,OA系统接收授权码和state参数用到;后续的操作中关键参数之一。
回调地址(redirect_uri):http://192.168.101.100:8111/oauth/redirect/hos
选择应用功能--->认证管理,配置OA系统的回调地址,默认配置一样
2.3 配置OAuth2参数
提示
客户端id(client_id)和客户端秘钥(client_secret),是自动生成的两个参数,这两个参数是后续调用接口操作中的关键参数。
2.4 下一步需要用到的参数
提示
客户端id(client_id):19sexv587l02
客户端秘钥(client_secret):i0Yg8w6X7BU4
回调地址(redirect_uri):http://192.168.101.100:8111/oauth/redirect/hos
# 第二步,获取授权码
提示
以下面的ip和端口为例介绍配置,实际地址需要根据项目实际环境来修改。
统一认证前端ip和端口地址:http://114.251.235.4:8229;
统一认证后端ip和端口地址:http://114.251.235.4:8269;
OA应用的前端地址:http://192.168.101.100:8111;
需要用到的第一步注册的参数说明:
客户端ID(client-id): 19sexv587l02 #第一步注册应用时,生成的客户端ID
客户端秘钥(client-secret): i0Yg8w6X7BU4 #第一步注册应用时,生成的客户端秘钥
回调地址(redirect_uri):http://192.168.101.100:8111/callback
1. 浏览器输入OA系统链接
提示
OA系统的链接:该链接可以是OA系统的任意链接,比如http://192.168.101.100:8111/base-sys-resources。
OA系统需要记录【初始访问链接】,作用是在最后一个流程,完成登录之后,跳转回【初始访问链接】。
OA系统分未登录和已登录存在两种情况:
OA系统未登录:浏览器不存在有效的OA系统会话信息(没有OA系统session或者session信息过期)。
OA系统已登录:浏览器存在有效的OA系统会话。
1.1 未登录
需要OA系统前端拼接获取授权码的链接地址,并前端重定向到该地址,去统一认证服务器请求授权码。 下面地址是重定向的地址:
http://114.251.235.4:8229/oauth/authorize?response_type=code&client_id=19sexv587l02&redirect_uri=http://192.168.101.100:8111/callback&state=35e6b2693a937afc1c1402efbd156102
地址/参数 | 值 | 说明 |
---|---|---|
统一认证地址 | http://114.251.235.4:8229/oauth/authorize | 统一认证前端地址 |
response_type | code | 必要参数;值为code,固定参数; |
client_id | 19sexv587l02 | 必要参数;第一步注册所得; |
redirect_uri | http://192.168.101.100:8111/callback | 必要参数;回调地址,必须在第一步注册时配置上; |
state | 35e6b2693a937afc1c1402efbd156102 | 这个值是随机值,作用是安全校验;下次地址为跳转到的回调地址时,原值参数返回回来 |
OA系统拼接好统一认证授权链接,然后重定向到上述链接,并重定向到之后,在下面【2. 请求授权码】继续说明。
1.2 已登录
提示
OA系统可正常进入自己的系统页面,这种场景不需要统一认证后续操作。如果OA系统会话过期或失效,需要继续执行【1.1 未登录】的流程。
2. 请求授权码
提示
上面【1.1 未登录】场景重定向的链接,是请求授权码地址。
获取授权码,需要统一认证系统是登录状态。
统一认证系统分未登录和已登录存在两种情况:
统一认证系统未登录:浏览器不存在有效的统一认证系统登录状态信息。
统一认证系统已登录:浏览器存在有效的统一认证系统登录状态信息。
2.1 统一认证未登录
2.1.1 访问链接:
http://114.251.235.4:8229/oauth/authorize?response_type=code&client_id=19sexv587l02&redirect_uri=http://192.168.101.100:8111/callback&state=35e6b2693a937afc1c1402efbd156102
2.1.2 跳转到统一认证登录页进行登录:
http://114.251.235.4:8229/login/login?redirect=%2Foauth%2Fauthorize%3Fresponse_type%3Dcode%26client_id%19sexv587l02%26redirect_uri%3Dhttp%253A%252F%252F192.168.101.100%253A8111%252Fcallback%26state%3D35e6b2693a937afc1c1402efbd156102
提示
进行登录,登录成功后,跳转回2.1.1 访问链接,进入【2.2 统一认证已登录】流程
2.2 统一认证已登录
访问链接:
http://114.251.235.4:8229/oauth/authorize?response_type=code&client_id=19sexv587l02&redirect_uri=http://192.168.101.100:8111/callback&state=35e6b2693a937afc1c1402efbd156102
提示
访问链接的参数, 客户端ID(client_id)、回调地址(redirect_uri)必须是之前注册OA系统时注册的,如果不是的话,会提示错误,不会进入回调地址。
正常跳转到:
http://192.168.101.100:8111/callback?code=pdsdkEUVtm&state=35e6b2693a937afc1c1402efbd156102
提示
跳转到上述地址(http://192.168.101.100:8111/callback?code=pdsdkEUVtm&state=35e6b2693a937afc1c1402efbd156102) 进入下一步流程【3. 接收授权码和state】
异常情况链接:
http://114.251.235.4:8229/oauth/authorize?response_type=code&client_id=11111&redirect_uri=http://192.168.101.100:8111/callback&state=35e6b2693a937afc1c1402efbd156102
提示
异常情况会出现如下类似错误提示,且不能重定向到回调地址链接
3. 接收授权码和state OA系统根据回调的链接,接收到code和state参数
3.1 首先处理接收到的state参数
提示
state参数是在【1. 浏览器输入OA系统链接】的流程中,OA系统自己生成的一个随机串放入统一认证请求授权码的链接当中。
state参数是随着回调地址,跟获取到的授权码一起传回OA系统的,作用是为了保护回调掉地址免遭攻击。
如果state参数跟之前的不一致,OA系统就不要进行下一步【第三步,根据授权码获取token】操作。
3.2 处理接收到的code参数
前端页面接收到授权码(code)参数,传入后端进入下一步【第三步,根据授权码获取token】操作
# 第三步,OA系统根据授权码获取token
获取token
根据回调地址携带的授权码,获取token信息;为了安全考虑,后台调用获取token接口。
该接口是post接口。
统一认证后端获取token,请求类型是POST,接口地址:
http://114.251.235.4:8269/api/oauth/token
需要传入的参数说明:
参数 | 值 | 说明 |
---|---|---|
client_id | client_id | 第一步注册获得 |
client_secret | client_secret | 第一步注册获得(不能泄露) |
redirect_uri | redirect_uri | 回调地址,这个本身就是应用系统提供的固定地址 |
grant_type | grant_type | 固定参数 authorization_code |
code | code | 授权码值 |
成功结果:
{
"code": "200",
"msg": "success",
"data": {
"access_token": "0edb4a06-761c-4584-9085-8245d9bffcb5",
"token_type": "bearer",
"refresh_token": "32e3df54-5de0-42e4-af96-4b82e7e95fa2",
"expires_in": 6665,
"scope": "all"
},
"success": true
}
提示
成功获取到token信息之后,OA系统可以把token信息保存起来,不能泄露。携带token请求【#### 第四步,OA系统根据token获取登录用户信息】
失败结果:
{
"code": "500",
"msg": "授权码无效::OauthInfoException",
"data": null,
"success": false
}
# 第四步,OA系统根据token获取登录用户信息
统一认证后端获取用户信息,请求类型是POST,接口地址:
http://114.251.235.4:8269/api/oauth/resource/getUserInfo
参数:
Body参数:
- access_token:上一步获取到的access_token
成功结果:
{
"code": "200",
"msg": "success",
"data": {
"accountCode": "admin",
"accountName": "测试管理员",
"personInfo": {
"sex": "",
"phone": "",
"name": ""
},
"tenantId": ""
},
"success": true
}
提示
OA系统获取用户信息成功。根据userInfo字段中的用户名,完成创建自己的会话信息等操作,完成登录。
失败结果:
{
"msg": "Invalid access token: 0edb4a06-761c-4584-9085-8245d9bffcb51",
"code": "401"
}
# 第五步,完成登录
1. 根据获取到的用户信息,创建登录需要的会话等,完成登录操作
2. 登录完成重定向到首页或者初始访问链接(如果记录了初始链接)
提示
在【第二步,获取授权码】--【1. 浏览器输入OA系统链接】中,如果OA系统有记录【初始访问链接】,在本次认证完成时候,可以跳转回到【初始访问链接】,
如果未记录初始访问链接,只能去跳转回默认首页页面。
这个逻辑需要OA系统自己处理。
登录成功之后,进入OA系统页面。
# 应用系统集成--CS系统
# 第一步,注册系统
1.1 新增应用系统,CS系统
- 进入【应用中心】->【应用管理】
2.1. 配置自定义协议信息
# 第二步,打开应用系统并传参
门户通过医为客户端,打开exe应用,并传入token值给CS应用系统
# 第三步,应用系统调用认证token接口
(1) 获取到token值,以及注册的应用标识(客户端注册的AppId)、应用秘钥(客户端注册的AppSecret),调用接口自定义协议接口获取用户信息。 (2) 根据获取到的用户信息,完成认证操作。
# 集成接口介绍
本节介绍的是,统一认证集成过程中,用到的接口详细说明
# 一、授权接口
- 基本信息
名称 描述 地址 http://{统一认证前端ip和端口}/oauth/authorize 接口名称 获取授权码 请求类型 GET - 请求示例
http: {统一认证前端ip和端口}/oauth/authorize?response_type=code&client_id=19sexv587l02&redirect_uri={应用系统回调地址}&state={应用系统提供的随机码}
参数说明
参数 中文说明 描述 response_type 响应类型 code client_id 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) redirect_uri 回调地址 跳转到应用系统的地址,会携带授权码(code参数值)和状态码(state参数值) state 任意值 用于保持请求和回调的状态,在回调时,会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性,也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造(CSRF)攻击 处理逻辑.
- 验证client_id是否有效
- 校验redirect_uri是否有效;统一认证配置中,可配置多个redirect_uri地址(以“,”分隔),用逗号分隔。
- 校验成功后,页面跳转至redirect_uri并附有授权码和state参数(这个是应用系统请求是携带的原值)
返回值
- 参数正确登录成功时,会跳转到http://{应用系统回调地址}?code={授权码}&state={XXX}
- client_id错误
{
"code": "500",
"msg": "获取客户端信息失败",
"data": null,
"success": false
}
- redirect_uri无效
{
"code": "500",
"msg": "Invalid redirect: http://192.168.101.138:8099/DTH_SSO/login does not match one of the registered values.",
"data": null,
"success": false
}
- 描述
- 此接口是浏览器redirect跳转方式调用。
- 如果用户已完成过登录,访问此地址则会直接跳转到指定的回调地址,带上code。如果请求参数中传入了state,这里会带上原始的state值。
- 如果用户未登录,访问此地址会跳转至登录页面,显示应用配置的认证方式,用户完成登录后跳转到指定的回调地址,带上code。如果请求参数中传入了state,这里会带上原始的state值。
# 二、获取token
- 基本信息
名称 描述 地址 http://{统一认证后端ip和端口}/api/oauth/token 接口名称 获取token 请求类型 POST 请求头 Content-Type=application/x-www-form-urlencoded - 请求示例
http: {统一认证后端ip和端口}/api/oauth/token
参数说明
参数 中文说明 描述 client_id 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) client_secret 客户端秘钥 统一认证配置注册的客户端秘钥 code 授权码 回调地址接收到的code参数值 redirect_uri 回调地址 请求授权码时的回调地址 grant_type 认证方式 请求类型,默认authorization_code 处理逻辑
- 验证client_id是否有效
- 验证client_secret是否有效
- 验证redirect_uri是否是请求授权码的地址
- 验证code是否有效
- 根据以上判断、验证及认证结果返回JSON数据
返回值
- 正确返回时
{
"code": "200",
"msg": "success",
"data": {
"access_token": "bf7aa377-e7c8-4f22-8639-6567a3a3cfb2",
"token_type": "bearer",
"refresh_token": "4f2f6ce7-3bef-4a31-905c-d8a6afc1db72",
"expires_in": 999,
"scope": "read write"
},
"success": true
}
- client_id无效
{
"code": "500",
"msg": "获取客户端信息失败"
}
- client_secret无效
{
"code": "500",
"msg": "Bad client credentials"
}
- 授权码无效
{
"code": "500",
"msg": "授权码无效::OauthInfoException"
}
- 回调地址无效
{
"code": "500",
"msg": "Redirect URI mismatch.::RedirectMismatchException"
}
# 三、刷新token
- 基本信息
名称 描述 地址 http://{统一认证后端ip和端口}/api/oauth/token 接口名称 刷新token 请求类型 POST 请求头 Content-Type=application/x-www-form-urlencoded - 请求示例
http: {统一认证后端ip和端口}/api/oauth/token
- 参数说明
参数 中文说明 描述 client_id 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) client_secret 客户端秘钥 统一认证配置注册的客户端秘钥 refresh_token 刷新token 刷新token grant_type 认证方式 请求类型,默认refresh_token - 处理逻辑
- 验证client_id是否有效
- 验证client_secret是否有效
- 根据refresh_token生成token
- 根据以上判断、验证及认证结果返回JSON数据
- 返回值
- 正确返回时
{
"code": "200",
"msg": "success",
"data": {
"access_token": "bf7aa377-e7c8-4f22-8639-6567a3a3cfb2",
"token_type": "bearer",
"refresh_token": "4f2f6ce7-3bef-4a31-905c-d8a6afc1db72",
"expires_in": 999,
"scope": "read write"
},
"success": true
}
# 四、获取认证用户
- 基本信息
名称 描述 地址 http://{统一认证后端ip和端口}/api/oauth/resource/getUserInfo 接口名称 刷新token 请求类型 POST 请求头 Content-Type=application/x-www-form-urlencoded - 请求示例
http: {统一认证后端ip和端口}/api/oauth/resource/getUserInfo
- 参数说明
参数 中文说明 描述 client_id 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) client_secret 客户端秘钥 统一认证配置注册的客户端秘钥 access_token 刷新token 刷新token - 处理逻辑
- 验证client_id是否有效
- 验证client_secret是否有效
- 根据access_token获取用户信息
- 根据以上判断、验证及认证结果返回JSON数据
- 返回值
- 正确返回时
{
"code": "200",
"msg": "success",
"data": {
"accountCode": "admin",
"accountName": "测试管理员",
"personInfo": {
"sex": "",
"phone": "",
"name": ""
},
"tenantId": ""
},
"success": true
}
- access_token无效
{
"msg": "Invalid access token: 0edb4a06-761c-4584-9085-8245d9bffcb51",
"code": "401"
}
# 自定义协议
门户通过对接系统的appId获取自定义token并转发给对接系统。
# 通过appId获取自定义token
- 基本信息
名称 描述 地址 http://{统一认证后端ip和端口}/api/custom/protocol/get-token-by-appId 接口名称 获取自定义协议token 请求类型 GET 请求头 Content-Type=application/x-www-form-urlencoded - 请求示例
http: {统一认证后端ip和端口}/api/custom/protocol/get-token-by-appId
参数说明
参数 中文说明 描述 appId 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) 处理逻辑
- 验证appId是否配置自定义协议
- 获取登录用户
- 拼接自定义协议token
- 将token和用户信息绑定存入缓存
- 返回token
返回值
- 正确返回时
{
"code": "200",
"msg": "success",
"data": "customToken_762c0bfbe5484ad697110855dc9ecce6me3eS76R1w4x",
"success": true
}
# 通过token获取用户信息
- 基本信息
名称 描述 地址 http://{统一认证后端ip和端口}/api/custom/auth/get-user-info 接口名称 获取用户信息 请求类型 GET 请求头 Content-Type=application/x-www-form-urlencoded - 请求示例
http: {统一认证后端ip和端口}/api/custom/auth/get-user-info
参数说明
参数 中文说明 描述 appId 客户端ID(应用标识) 统一认证配置注册的客户端ID(应用标识) appSecret 客户端秘钥(应用标识) 统一认证配置注册的客户端ID(应用标识) token token 上一步获取到的token 处理逻辑
- 验证该token是否在缓存有对应用户信息
- 返回用户信息
返回值
- 正确返回时
{
"code": "200",
"msg": "success",
"data": {
"accountCode": "admin",
"accountName": "测试管理员",
"personInfo": {}
},
"success": true
}
# 单点退出
# 单点退出接口
基本信息
业务系统需要支持单点退出功能时,需要提供一个单点退出接口。
详细说明
当业务系统需要使用统一认证服务的单点退出功能时,需要将认证时,统一认证返回的accessToken参数与自己的session进行绑定, 当从统一认证服务进行退出操作时,统一认证服务会查询该用户所在的所有应用是否支持单点退出配置。统一认证服务会挨个调用支持单点 退出系统配置的退出接口,将登录名和accessToken作为参数传递,业务系统接收到后,需要根据accessToken参数将自身对应的session 清除
接口详情
名称 | 描述 |
---|---|
接口名称 | 单点退出 |
接口所属 | 业务系统 |
请求类型 | POST |
请求头 | Content-Type=application/x-www-form-urlencoded |
- 参数说明
参数 | 中文说明 | 描述 |
---|---|---|
loginName | 用户登录名 | 需要单点退出的用户 |
oauth2AccessToken | 统一认证访问token | 业务系统通过该token在自己系统进行退出操作 |
- 接口配置
应用中心-->应用管理-->选择应用-->认证管理
- 接口返回
{
"code": "200",
"msg": "success"
}
# 其他配置
# 集群需修改配置
# 1. 缓存修改为redis方式存储
1.1 配置redis地址
spring:
redis:
# redis密码
password:
# redis数据库编号
database: 0
timeout: 5000
# 缓存库地址,单机模式下使用
host: 127.0.0.1
# redis端口
port: 6379
# redis集群下使用
#cluster:
#nodes: 114.242.246.250:7001,114.242.246.250:7002,114.242.246.250:7003,114.242.246.250:7004,114.242.246.250:7005,114.242.246.250:7006
1.2 配置系统缓存类型
# 缓存采用redis方式存储
framework:
hoscache:
##使用的缓存类型,目前支持 redis ehcache
type: redis
1.3 配置token缓存方式
# token缓存采用redis方式存储
auth:
oauth:
storeType: redis