# 统一授权认证服务
# 概述
一套用户名密码即可访问所有应用,统一企业内部身份认证机制,提升企业应用的集成和管理能力
# 单点登陆架构
集成多应用认证管理,同时提供单点登陆管理服务,进行账号,黑白名单、个性化、应用管理等配置
基于oauth2认证管理流程,通过返回accessToken集成认证管理,整体如下:
流程描述:
- 认证通过http请求获取到accessToken,返回客户端
- 业务在集成token之后,获取到后台的请求认证;
- 如果认证不成功,则会重定向到单点登陆界面;
- 一次系统登陆,在同一浏览器会话里面有效,另一个系统则不需要进行二次登陆;
# 集成登陆
# 配置第三方应用
配置应用获取到 clientId
# 获取 code
请求获取到 code,用户登录平台后点击跳转到第三方系统提供的 redirect_uri 获取临时票
- 接口请求方式: POST
- 接口地址: https://{endpoint}?code=CODE_VALUE&endpoint=endpoint&state=STATE_VALUE
示例地址:
# 示例请求
http://alinesno-oauth-server.beta.linesno.com/login.html?response_type=code&redirect_uri=http://alinesno-oauth-admin.beta.linesno.com&client_id=27f87cd0043ae5832c11cfe424e633d5
# 获取 AccessToken
获取的 code,以及秘钥等参数,获取 access_token 和 openid
- 接口请求方式: POST
- 请求 Content-Type: application/json
- 接口地址: {endpoint}/oauth2/V1.0/access_token
返回数据示例
{
"data": {
"access_token": "0400c60e89fa677b98f0ae17b250e1a9",
"refresh_token": "35416d4c5623b1620f4c5c076b6bbb46",
"expires_in": 3600
},
"code": "00000",
"msg": "",
"resp_time": "20210106165820.020"
}
# openId 解析
解析 openId,获取用户信息,此在 accessToken 里面获取,解析如下:
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
public Claims parseToken(String token) throws Exception {
String key = tokenProperties.getSecret();
try {
return Jwts.parser().setSigningKey(key.getBytes()).parseClaimsJws(token).getBody();
} catch (Exception e) {
log.error("密钥异常:{}" , e) ;
throw new Exception("登陆密钥已过期");
}
}
# 单点退出
配置退出通知,会调用客户地址,同时发送当前用户的 token,本地删除掉缓存的 AccessToken,于系统重新认证退出
/**
* 用户退出通知
* @param token
* @return
*/
@RequestMapping("/sso/notifyUrl")
public AjaxResult ssoNotifyUrl(String tokens) {
// container token
if(StringUtils.isNoneBlank(tokens)) {
String[] tokenArr = tokens.split(",") ;
for(String s : tokenArr) {
AccessToken at = IUaaClientActionStrategy.accessTokenContainer.remove(s) ;
log.debug("at = {}" , at) ;
}
}
return AjaxResult.success() ;
}
# 其它
- 无