1. 概述
三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code)
登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址
登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户
2. 接入导图
说明:有三方系统免登进入V8
3. 接入步骤
3.1. 工程下载
cip-spi-user-avoid-thirdavoid.zip
3.2. Nacos配置【按需】
注意:需要再ctp-user微服务下 yaml 格式配置:
seeyon:
thirdauth:
clientId: xxx
clientSecret: xxx
properties 格式配置
seeyon.thirdauth.clientId=xxx
seeyon.thirdauth.clientSecret=xxx
3.3. 工程开发
开发过程请参考【场景/方法说明】
3.4. spi jar 打包并部署
参考 SPI扩展
配置完成后, 重启 ctp-user 服务
3.5. 测试方式
说明:免登地址拼接规则:
/oauth/home
?mobile=%2Fmain-mobile%2Fportal # url encode 后重定向地址
&web=%2Fmain%2Fportal # url encode 后重定向地址
&businessType=outsider # 固定值
&type=thirdavoid # 约定的唯一类型
&dynamicField=code # 追加的 code 的 key 的值,如追加 code 这里为 code, 追加 ticket 这里值为 ticket
&code=2403832009216967675 # 三方追加的值
3.6. 内容校验
浏览器地址输入:<domain>/service/ctp-user/api/sso-config
通过免登地址,登录 A 账号查看待办, 后, 再打开 B 账号的待办, 不会切换账号 端: web 解决方法: ctp-user nacos配置
yaml 格式配置:
seeyon:
avoid:
clearCookieTypes:
- cscc # 类型1
- pccscc # 类型2
properties 格式配置:
seeyon.avoid.clearCookieTypes[0]=cscc
seeyon.avoid.clearCookieTypes[1]=pccscc
4. 场景/方法说明
4.1. 从免登地址中获取信息(Request)
说明:上游系统在URL请求时,携带授权信息/加密用户信息,COP平台拦截信息并模拟登陆场景。
免登地址拼接规则:
免登地址实例:
/oauth/home
?mobile=%2Fmain-mobile%2Fportal # url encode 后重定向地址
&web=%2Fmain%2Fportal # url encode 后重定向地址
&businessType=outsider # 固定值
&type=thirdavoid # 约定的唯一类型
&dynamicField=code # 追加的 code 的 key 的值,如追加 code 这里为 code, 追加 ticket 这里值为 ticket
&code=2403832009216967675 # 三方追加的值
/**
* 从请求中提取参数并获取用户信息
*
* @param code 三方追加的 code 的值
* @param extData 三方追加的扩展参数
* @return 用户属性信息
*/
@Override
public CtpAvoidLoginUserInfoDto getUserInfo(String code, Map<String, String> extData) {
log.info("从请求中提取参数并获取用户信息, code:{}", code);
// 调用内部方法进行逻辑处理
thirdavoidSsoHandler.test();
// [按需实现] 获取 request 对象
HttpServletRequest request = CtpUserSpiUtils.getRequest();
// 从 request 中获取想要的参数
request.getParameter("xxx");
// 通过 code 获取 token
// eg. String token = getTokenByCode(code);
// 通过 token 获取用户登录名
// eg. String loginName = getLoginNameByToken(token);
// // [按需实现] 免登成功后重定向地址, 如果不配置, 则默认跳转至打开免登时的目标地址
// CtpUserSpiRedirectUrlDto ctpUserSpiRedirectUrlDto = CtpUserSpiRedirectUrlDto.builder()
// .webRedirectUrl("/main/portal") // web 重定向地址
// .mobileRedirectUrl("/main-mobile/portal") // mobile 重定向地址
// .build();
// // [按需实现] 缓存免登后保存的三方 token
// CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
// .thirdToken("xxx") // 待缓存的三方 token
// .expired(null) // 过期时间_秒
// .extData(new HashMap<>()) // 扩展参数
// .build();
// 返回用户信息、等缓存的三方认证 token、重定向地址
return CtpAvoidLoginUserInfoDto.builder()
// 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
.thirdLoginName("zhangsan")
// .thirdUserId("123456")
// .thirdMobile("13900000001")
// .thirdUserEmail("abc@abc.com")
// .thirdUserCode("usercode")
//用于登录的用户信息, 上面五个参数只选择一下赋值即可
// [按需实现] 登录用户的租户信息
//.tenantType() // 租户数据类型:code / id
//.tenantData() // 与 tenantType 对应, 租户信息的值
// // [按需实现] 待缓存免登后保存的三方 token
// .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 三方认证 token
// [按需实现] 免登成功后重定向地址
//.ctpUserSpiRedirectUrlDto(ctpUserSpiRedirectUrlDto); // 免登成功后重定向地址
.build();
}
注: 不支持获取自定义追加的参数, 除了通过 dynamicField
定义人参数 key 外, 其它追加的参数无法获取
4.2. 三方认证Token持久化
说明:三方授权Token需要COP平台负责持久化存储,包含写入根域名、写入缓存、写入Redis等场景。
// // [按需实现] 缓存免登后保存的三方 token
// CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
// .thirdToken("xxx") // 待缓存的三方 token
// .expired(null) // 过期时间_秒
// .extData(new HashMap<>()) // 扩展参数
// .build();
4.3. 三方Token自动刷新(定时)
说明:三方授权Token定时失效,需要定时使用原始Token换取新的Token场景。
/**
* 刷新三方 token
*
* @param thirdTokenDto 三方 token 信息
* @return 三方 token 保存 DTO
*/
@Override
public CtpUserSpiThirdTokenDto doRefreshToken(ThirdTokenDto thirdTokenDto) {
return CtpAvoidLoginMiddlePageProviderService.super.doRefreshToken(thirdTokenDto);
}
4.4. 自定义5元素用户标识
说明:三方异构系统用户匹配COP平台用户,支持手机号码、邮箱、登录名、用户编码、UserID任一字段值匹配免登。
// 返回用户信息、等缓存的三方认证 token、重定向地址
return CtpAvoidLoginUserInfoDto.builder()
// 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
.
thirdLoginName("zhangsan")
// .thirdUserId("123456")
// .thirdMobile("13900000001")
// .thirdUserEmail("abc@abc.com")
// .thirdUserCode("usercode")
//用于登录的用户信息, 上面五个参数只选择一下赋值即可
// [按需实现] 登录用户的租户信息
//.tenantType() // 租户数据类型:code / id
//.tenantData() // 与 tenantType 对应, 租户信息的值
// // [按需实现] 待缓存免登后保存的三方 token
// .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 三方认证 token
// [按需实现] 免登成功后重定向地址
//.ctpUserSpiRedirectUrlDto(ctpUserSpiRedirectUrlDto); // 免登成功后重定向地址
.
build();
4.5. Nacos配置定义、获取值
说明:例如应用ID、秘钥、访问地址等跨环境需要变更参数,可以在nacos配置文件中维护
nacos位置:ctp-user
nacos参数值获取:需要通过工具类获取
CtpUserSpiUtils.getProperjavatyByName("seeyon.thirdavoid.clientId");
4.6. 日志查询
ctp-user.info 日志下, 搜索关键字 third dto
, 通过入口查询该次请求的 traceId, 再根据 traceId 查询整个链路处理情况
5. 注意事项
无