这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

免登-中间页模式

支持三方异构系统免登进入COP平台SPI扩展能力。不支持免登地址中携带自定义参数

1. 概述

三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code)

登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址

登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户

2. 接入导图

说明:有三方系统免登进入V8

1720767916820

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

1722921937706

通过免登地址,登录 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. 注意事项