VBaseSSO 单点登录
VBaseSSO 单点登录,包括了V-AppServer 单点登录到 V 系统、V-AppServer 单点登录第三方系统、以及第三方系统登录到 V-AppServer 等。
1. V-AppServer 单点登录到 V 系统
支持A系统(V-AppServer)单点登录到B系统(V-AppServer)。
举例:登录A系统后,在A系统打开B系统的页面(需要登录),实现自动登录。
info在该登录场景中,父应用即系统A,子应用即系统B。
A 系统配置中心,设置【VBASE-单点登录】,选择其中一个第三方系统配置参数(支持多个单点登录系统)。
访问目录:配置中心 → 系统高级配置 → 系统维护 → 配置管理。
配置参数说明:
配置参数说明
bizSysId:第三方业务系统标识;
bizSysSecret:第三方业务系统密钥;
bizSysRequestUrl:第三方单点登录接口地址;如果B系统也是V-AppServer,则默认单点登录接口地址,仅修改子应用服务地址如:http://10.1.28.143:8091/module-operation!executeOperation?operation=VSSOLogin
B 系统配置中心,设置【VBASE - 接收单点登录方配置】。
访问目录:配置中心 → 系统高级配置 → 系统维护 → 配置管理。
配置参数说明
bizSysId:(必填)系统唯一标示;
bizSysSecret:(必填)秘钥;
customLoginConvert:自定义登录信息转换,默认账号转换;
signature_valid: 数字签名有效期,单位:秒,默认600秒(10分钟);
signature_buff_time: 数字签名网络最大缓冲期,单位:秒,默认300秒(5分钟);
custom_login_executor:自定义登录执行器,默认vbase登录;自定义登录信息转换和自定义登录执行器的实现,参考4.单点登录自定义EP实现。
VBase 在开发平台提供 API,获取配置管理的单点登录地址。
在父系统中调用构件方法:
构件编码:
vbase_sso方法编码:
API_VSSOCreateSSOThirdPartyUrl方法输入:
| 编码 | 名称 |
|---|---|
redirectUri | 单点登录成功后目标地址(无需url编码) |
bizSysId | 单点登录业务系统标识 |
additionalProps | 增加租户编码的附加属性propertyKey=”tenant_code”propertyValue=多租户系统租户编码 |
方法输出:
| 编码 | 名称 |
|---|---|
requestUrl | 单点登录地址(页面打开的链接地址) |
isSuccess | 是否成功 |
errorDetail | 异常信息 |
errorCode | 错误编码 |
实现效果:登录 A 系统后,单点登录打开 B 系统页面。
A 系统调用
vbase_sso.API_VSSOCreateSSOThirdPartyUrl (生成第三方系统请求url)生成单点登陆到 B 系统的链接地址:http://10. ###1.28.143:8091/webapi/vbase_sso/API_VSSOCreateSSOThirdPartyUrl?
redirectUri=http%3a%2f%210. ###1.28.143:8094%2fmodule-operation!executeOperation
%3fcomponentCode%3derp_loginframe%26windowCode%3dindex&bizSysId=test返回结果:
{
"msg":"",
"data":{
"requestUrl":"http://10. ###1.28.143:8091/module-operation!executeOperation?
operation=VSSOLogin&login_sso=eyJzc29fc2lnIjoiODFmZTc1Nzc3YWQ2NWIzNDc2Yzg4YmJkNjk2M2FlMWY5ODBmNj
cxMyIsIm5vbmNlIjoiLTEzNjc0ODEyMjAiLCJhY2NvdW50IjoieWVxcSIsInRpbWVzdGFtcCI6IjE2NTgxOTU2MjE4MjcifQ==
&redirect_uri=http%3A%2F%2F10. ##1.28.143:8094%2Fmoduleperation%21executeOperation%3FcomponentCode%
3Derp_loginframe%26windowCode%3Dindex",
"errorDetail":null,
"errorCode":null,
"isSuccess":true
},
"success":true
}
2. V-AppServer 单点登录第三方系统
用于支持 A 系统(V-AppServer)单点登录到 B 系统(第三方服务)的功能,同时支持 A 系统单点登录到多个 B 系统。
A 系统单点登录 B 系统后,打开 B 系统中需登录权限的页面时,无需再输入 B 系统的账号密码,可直接打开。
info在该登录场景中,父应用即系统A,子应用即系统B。
A 系统为 V-AppServer ,B 系统为第三方系统。
A 产生数字签名
login_sso:拼接B系统bizSysId、bizSysSecret、时间戳、随机数、账号等数据排序 SHA-1加密;A 携带参数请求B系统单点登录地址;
B 系统解析参数
login_sso,获得 时间戳、随机数、账号、 数字签名sso_sig;根据本地保存的
bizSysId/bizSysSecret,和 时间戳、随机数、账号 生成数字签名;校验生成的数字签名与第三步获得的
sso_sig是否一致;根据账号或者其他参数转换 B 系统的用户信息;
B 系统的用户信息登录;
跳转到回调地址。
- 1.单点登录接口说明
- 2.单点登录接口逻辑实现
B 系统为非 V3 系统,则需要自行实现接口。
接口地址 第三方自定义接口地址bizSysRequestUrl,
如:http://10.10. ###1.128:8080/ssoLogin入参 redirect_uri 单点登录回调地址(url编码) login_sso 登录信息(base64编码),由A系统生成 示例地址 http://10.10. ###1.128:8080/ssoLogin?redirect_uri=xxxx&login_sso=xxxx (1)解析请求参数 login_sso
Base64 解码 login_sso 参数得到 json 字符串。
解析 json 得到 Map 对象,Map 包含以下 key 值:
sso_sig:数字签名timestamp:时间戳 (毫秒级时间戳)nonce:随机数(4-6位数字)account:账号注意:V-AppServer 支持传附加属性,如需其他参数,与 V-Server 约定好附加属性key值。
(2)校验数字签名
① 校验请求是否超时
根据第三方系统的超时时间,使用请求参数 timestamp,判断请求是否超时。
② 生成数字签名进行校验
第三方的
bizSysId、bizSysSecret、账号、时间戳、随机数 ,排序 后拼接成字符串再 SHA-1 加密得到本地数字签名,代码示例:public static void main(String[] args) {
String bizSysId = "test";
String bizSysSecret = "93d9b014d11f00274d493c73a420cab6";
String account = "admin";
String timestamp = "1658130447452";
String nonce="9122293";
String[] array = new String[] { bizSysId, bizSysSecret, account, timestamp, nonce };
StringBuffer sb = new StringBuffer();
Arrays.sort (array);
for (int i = 0; i < array.length; i++) {
sb.append (array[i]);
}
String signature = CommonUtils.sha1(sb.toString());
System.out.print(signature);
}
}将生成的数字签名 signature 与上一步的参数值 sso_sig 对比是否一致,一致则进行下一步,不一致则登录失败。
(3)用户登录并跳转
在数字签名校验成功后,根据请求参数的账号信息
account或者其他附加参数转换本地用户信息(查询本地人员账号表),用本地的用户信息登录第三方系统。登录成功后,跳转回调地址
redirect_uri。
A 系统保存第三方系统 B 单点登录必要信息,如下:
配置参数说明
bizSysId:系统唯一标识,用于生成数字签名,如:serverA;bizSysSecret:秘钥,用于生成数字签名,可用UUID或较为复杂的字符串;bizSysRequestUrl:第三方单点登录接口地址;第三方自定义接口地址bizSysRequestUrl,如:http://10.10. ###1.128:8080/ssoLogin?redirect_uri=xxxx&login_sso=xxxx。A 系统配置中心,设置【VBASE-单点登录】,选择其中一个第三方系统配置参数(支持多个单点登录系统)。
访问目录:配置中心 → 系统高级配置 → 系统维护 → 配置管理。
VBase 在开发平台提供 API,获取配置管理的单点登录地址。
在父系统中调用构件方法:
构件编码:
vbase_sso方法编码:
API_VSSOCreateSSOThirdPartyUrl方法输入:
| 编码 | 名称 |
|---|---|
redirectUri | 单点登录成功后目标地址(无需url编码) |
bizSysId | 单点登录业务系统标识 |
additionalProps | 请求参数(附加参数) |
方法输出:
| 编码 | 名称 |
|---|---|
requestUrl | 单点登录地址(页面打开的链接地址) |
isSuccess | 是否成功 |
errorDetail | 异常信息 |
errorCode | 错误编码 |
3. 第三方系统单点登录 V-AppServer
A 系统配置中心,设置 VBASE - 接收单点登录方配置。
访问目录:配置中心 → 系统高级配置 → 系统维护 → 配置管理。
配置参数说明
bizSysId:(必填)第三方系统唯一标示;
bizSysSecret:(必填)第三方系统与V执行系统共同持有的秘钥;
customLoginConvert:自定义登录信息转换,默认账号转换;
signature_valid: 数字签名有效期,单位:秒,默认600秒(10分钟);
signature_buff_time: 数字签名网络最大缓冲期,单位:秒,默认300秒(5分钟);
custom_login_executor:自定义登录执行器,默认vbase登录;
第三方单点登录到V系统,需要构造V系统的单点登录地址;
格式如下:
http://服务地址/module-operation!executeOperation?operation= VSSOLogin & login_sso =xxxx& redirect_uri =xxxxx示例:
http://V-AppServer服务地址/module-operation!executeOperation?operation= VSSOLogin & login_sso
=eyJ0aW1lc3RhbXAiOiIxNTM3NDQ0MzM5OTYyIiwic3NvX3NpZyI6ImRhZDg0MzQ3YTQ1YTQ5NWQ3OTA1YWMxMThmNzc2OWQyZjViNWRmMWE
iLCJub25jZSI6Ii0xMzY3NDgxMjIwIiwidGVuYW50X2NvZGUiOiJUQU5HIiwiYWNjb3VudCI6ImFkbWluIn0=& redirect_uri =module-
operation%21executeOperation%3Foperation%3DForm%26componentCode%3Dlogined_page_test%26windowCode%3Dtest参数说明:
(1) operation= VSSOLogin
V3执行系统默认单点登录接口,固定值:
VSSOLogin。(2) login_sso
单点登录信息参数。
① 生成 sso _sig
构造说明:
bizSysId、 bizSysSecret 和本地生成的 timestamp、 nonce、account
五个字符串进行 排序 —>拼接—>sha-1 加密得到 sso_sig 值。
注意事项: timestamp为毫秒级时间戳;nonce建议为4-6位随机数。
代码示例:
String[] array = new String[] { _bizSysId, bizSysSecret, loginName, timeStamp, nonce };
StringBuffer sb = new StringBuffer();
// 字符串排序
Arrays.sort(array);
for (int i = 0; i < array.length; i++) {
sb.append(array[i]);
}
String sso_sig = null;
try {
sso_sig = CryptoUtils.hexSHA1(sb.toString());
} catch (Exception e) {
throw new UnexpectedException("使用sha-1进行编码错误!", e);
}
② 生成 login_sso
构造说明:
Map<String, String> 对象存储以上参数;
Map 转 Json 格式得到 Json 字符串;
Base64 编码 Json 字符串得到 login_sso 参数值。
代码示例:
Map<String, String> login_ssoMap = new HashMap<String, String>();
login_ssoMap.put("sso_sig", sso_sig);
login_ssoMap.put("timestamp", timeStamp);
login_ssoMap.put("nonce", nonce);
login_ssoMap.put("account", loginName);
if (null != additionalProps && !additionalProps.isEmpty()) {
additionalProps.remove("sso_sig");
additionalProps.remove("timestamp");
additionalProps.remove("nonce");
additionalProps.remove("account");
login_ssoMap.putAll(additionalProps);
}
String login_sso = JsonUtils.toJson(login_ssoMap);
try {
login_sso = CryptoUtils.encodeBASE64(login_sso);
} catch (Exception e) {
throw new UnexpectedException("使用BASE64加密错误!", e);
}
(3) redirect_uri
单点登录回调地址,即第三方系统单点登录V3执行系统最终跳转的地址。
注意: 回调地址需要 UTF-8 编码 URLEncode 。
4. V 系统单点登录自定义 EP 实现

如果默认的账号转换,无法满足业务需求,需要实现手机号转换本地登录信息,
实现EP扩展:
vbase_sso. EP_VSSO_CustomLoginConvert(EP_VSSO_自定义用户登录信息转换器)实例操作步骤:
新建一个业务构件,引用
vbase_sso(VBASE-单点登录)实现构件方法的方法扩展
实现本地用户登录信息转换逻辑
方法输入:
方法输出:
如果默认的vbase登录无法满足业务需求,需要同时登录统一认证,可以自定义登录执行器;
实现EP扩展:
vbase_sso. EP_VSSO_CustomLoginExecustor(SPI_VSSO_自定义登录执行器)
新建一个业务构件,引用
vbase_sso(VBASE-单点登录)实现构件方法的方法扩展
实现自定义登录逻辑
方法输入:
方法输出:
5. 单点登录到多租户系统的场景

系统 A 为普通V系统,系统 B 为多租户 V 系统。
此单点登录场景,父应用即系统A,子应用即系统B。
所有配置环节步骤与 V-AppServer单点登录到V系统 一致。
区别在于,多租户系统单点登录的地址获取:
构件编码:vbase_sso
方法编码:API_VSSOCreateSSOThirdPartyUrl
方法输入:
| 编码 | 名称 |
|---|---|
redirectUri | 单点登录成功后目标地址(无需url编码) |
bizSysId | 单点登录业务系统标识 |
additionalProps | 增加租户编码的附加属性propertyKey=”tenant_code”propertyValue=多租户系统租户编码 |
方法输出:
| 编码 | 名称 |
|---|---|
requestUrl | 单点登录地址(页面打开的链接地址) |
isSuccess | 是否成功 |
errorDetail | 异常信息 |
errorCode | 错误编码 |
6. 代码API
引入构件 com.toone.v3.platform-34vbase-sso-api-3.4.2
POM 代码构件依赖:
com.toone.v3.platform
34vbase-sso-api
3.9.0
bundle
provided
调用方式:
获取 VSSOManagerService :VSSOServiceFactory.getVSSOManagerService()
调用 Service 方法:createSSOThirdPartyUrl(bizSysId, redirectUri, additionalProps)
bizSysId:业务系统标识;redirectUri:单点登录成功后目标地址;additionalProps:请求参数(附加参数)。















