统一身份认证
3 分钟阅读
1. 概述
使用三方认证中心进行统一身份认证, 在登录 v8 系统时, 会先跳转到三方认证中心进行登录, 三方认证中心登录成功后, 重定向 v8 目标地址,完成系统登录过程。
2. spi 接入导图
统一身份认证时序图
3. 接入步骤
3.1. demo工程下载
注意:使用前请依赖平台 ctp-user-api 对应的版本进行扩展开发
cip-spi-user-sso-thirdauth.zip
3.2. 配置与使用
3.2.1. 重定向到 v8 系统的域名配置
主要配置认证中心授信信息, 如 clientId, clientSecret 等。
注意:以下配置需要在public下,其中dev.seeyonv8.com为V8平台域名,使用时请更换为对应环境域名或ip端口 yaml 格式配置:
seeyon:
system:
domain: dev.seeyonv8.com
properties 格式配置
seeyon.system.domain=dev.seeyonv8.com
3.2.2. 重要:开启三方认证中心开关
在ctp-user微服务下
yaml 格式配置:
开起spi认证,其中spisso为固定值
seeyon:
user:
authenticationType: spisso
认证类型配置,其中thirdauth为spi扩展的认证类型,对应spi代码中的类型,例如:maxkey、zhuyun等
seeyon:
spisso:
ssoType: thirdauth
配置与三方认证中心的授信信息
seeyon:
thirdauth:
clientId: xxx
clientSecret: xxx
properties 格式配置 开起spi认证
seeyon.user.authenticationType=spisso
认证类型配置
seeyon.spisso.ssoType=thirdauth
认证配置
seeyon.thirdauth.clientId=xxx
seeyon.thirdauth.clientSecret=xxx
3.3. spi jar 打包并部署
参考 SPI扩展
配置完成后, 重启 ctp-user 服务
3.4. 测试方式
说明:免登地址拼接规则:
工程开发完成并发布后,在URL中输入【服务域名】/main/portal,点击回车/访问后,浏览器自动重定向到统一身份认证中心认证页,输入认证中心账号密码后,成功进入V8平台首页,则标识工程正确,且连接无误。
3.5. 异常跟踪
3.6. 内容校验
浏览器地址输入:<domain>/service/ctp-user/api/sso-config
确认内容:
jar 包里的 clientId 与 ctp-user 里的关键配置是否一致
如何使用私服仓库, 确认仓库地址、账号密码是否配置
确认登录成功后的重定向域名是否正确
spi 是否配置成功
spi jar里的 spring.factories 配置是否正确
4. 工程核心接口说明
4.1. 登录
说明:URL输入【V8首页地址】,或者三方门户点击进入【V8首页地址】时,网关拦截跳转到三方统一身份认证页,
如果未登录则使用账号密码登录,成功登录后跳转到【V8首页地址】,并携带授权code;
如果已经登陆,无需输入账号密码,成功登录后跳转到【V8首页地址】,并携带授权code;
后台解析授权code,换取用户信息,V8登录成功。
【V8首页地址】可以是V8任何一个页面,除了登录页“/login”。
/**
* 三方认证 sso 登录地址
*
* @param request
* @param encodeRedirectUrl url encode 后的重定向地址,三方认证登录成功后的跳转地址
* encodeRedirectUrl: http://dev.seeeyon.com/thirdauth-login/aaa?url=/main/protal
* @return 三方认证中心登录地址
*/
@Override
public String getSsoLoginUrl(HttpServletRequest request, String encodeRedirectUrl) {
String thirdLoginUrl = "http://xxx.sso.com/login?redirectUrl=" + encodeRedirectUrl;
log.info("跳转到三方认证中心地址:{}", thirdLoginUrl);
return thirdLoginUrl;
}
/**
* 从三方认证接口中获取用户信息
*
* @param request
* @param encodeRedirectUrl url encode 后的重定向地址,三方认证登录成功后的跳转地址
* @return CtpUserSpiLoginUserInfoDto 三方用户信息 DTO
* @throws CtpUserSpiSsoException 三方认证登录失败时, 由 v8 自定义页面显示的异常信息
*/
@Override
public CtpUserSpiLoginUserInfoDto getUserLoginInfo(HttpServletRequest request, String encodeRedirectUrl) throws CtpUserSpiSsoException {
// 通过配置拿到三方 clientId
String clientId = ThirdauthSsoAuthConstants.NACOS_CLIENT_ID;
// 调用内部方法进行逻辑处理
thirdauthSsoAuthHandler.test();
// 调用三方认证接口,获取用户信息
// 获取三方认证中心登录后,追加的 code 的值
String code = request.getParameter(getRequestParaKey());
// 通过 code 获取 token
// eg. String token = getTokenByCode(code);
// 通过 token 获取用户登录名
// eg. String loginName = getLoginNameByToken(token);
// // [按需实现] 如果需要缓存三方认证中心的 token,则需要封装下面对象
// CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
// .thirdToken("123456") // 三方认证中心的 token
// .expired(3600L) // 过期时间_秒 可空,如果为空则默认 7 天
// .extData(new HashMap<>()) // [按需实现] 扩展参数, 下面刷新三方 token 方法 refreshThirdauthTokenByConfig 中的 thirdauthTokenConfigMap 会将这个扩展参数传入
// .build();
return CtpUserSpiLoginUserInfoDto.builder()
// 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
.thirdLoginName("zhangsan")
// .thirdUserId("123456")
// .thirdMobile("13900000001")
// .thirdUserEmail("abc@abc.com")
// .thirdUserCode("usercode")
//用于登录的用户信息, 上面五个参数只选择一下赋值即可
// 如果用户有租户条件
// .tenantType("code").tenantData(tenantCode) // or .tenantType("id").tenantData("-1")
// .thirdUserInfoJson("{\"name\":\"张三\"}") // [按需实现] 待缓存的三方用户信息, 下面登录方法 thirdauthSsoLogout 中将这个参数传入
// .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 如果需要缓存并刷新三方 token 信息,则封装这个参数
.build();
}
4.2. 三方认证Token持久化
说明:登录成功后,V8按需将三方持久化授权token写入根域名cookie中。
/**
* [按需实现] 三方认证中心 token 中否保存到 cookie中,如果需要, 则返回 cookie 的 key
*
* @return 保存三方 token 的 cookie 的 key 的值
*/
@Override
public String get4aTokenKey() {
return "4a-token";
}
4.3. 短连接
说明:三方认证成功后,重定向地址太长时使用短连接解决,支持两种模式:
1、紧凑模式:【V8访问域名】/oauth/home/sl/abc;
2、拼接模式:【V8访问域名】/oauth/home?mappingId=abc
/**
* [按需实现] 登录三方成功后的重定向地址是否使用短链接, 如果不需要使用短链接,不用实现或直接返回 null
*
* @return ShortLinkModeEnum 短链接模式<br/>
* ShortLinkModeEnum#COMPACT_MODE: 紧凑模式, eg: domain/path/sl/xxx。<br/>
* ShortLinkModeEnum#SPLICING_MODE: 拼接模式, eg: domain/path?mappingId=xxx
* 如果为 null,则不使用短链接
*/
@Override
public ShortLinkModeEnum shortLinkMode() {
return null;
}
4.4. Token同步刷新
说明:随V8 用户认证token刷新动作,按需同步刷新三方持久化授权token三方Token。
/**
* [按需实现] 刷新三方认证中心的 token
*
* @param thirdToken 三方认证中心 token
* @param thirdTokenConfigMap 三方认证中心 token 配置
* @return CtpUserSpiThirdTokenDto 三方认证中心 token DTO 包含 token 信息和过期时间
*/
@Override
public CtpUserSpiThirdTokenDto refreshThirdTokenByConfig(String thirdToken, Map<String, Object> thirdTokenConfigMap) {
return null;
}
4.5. 退出
说明:v8用户Token单独失效退出(通过API退出), 三方Token单独失效退出(通过API退出,页面重定向退出)
支持两个Token同步失效退出
/**
* [按需实现] 三方登出重定向地址, 三方认证中心可通过此地址进行用户登录操作,如果没有此接口,则不用实现
*
* @return url encode 后的登出后的重定向地址
*/
@Override
public String getEncodeLogoutRedirectUrl() {
return null;
}
/**
* [按需实现] 三方登出后台逻辑
*
* @param request
* @param thirdUserInfoJson
*/
@Override
public void thirdSsoLogout(HttpServletRequest request, String thirdUserInfoJson) {
}
4.6. 用户登录报错时,跳转到自定义错误页
说明:免登失败时,自动跳转到自定义错误页,支持自定义错误信息可视
4.7. Nacos配置定义、获取值
说明:例如应用ID、秘钥、访问地址等跨环境需要变更参数,可以在nacos配置文件中维护
nacos位置:ctp-user
nacos参数值获取:需要通过工具类获取
String clientId = CtpUserSpiUtils.getPropertyByName("seeyon.thirdauth.clientId");
String clientSecret = CtpUserSpiUtils.getPropertyByName("seeyon.thirdauth.clientSecret");
5. 注意事项
无