# 统一授权认证服务

# 概述

一套用户名密码即可访问所有应用,统一企业内部身份认证机制,提升企业应用的集成和管理能力

# 单点登陆架构

集成多应用认证管理,同时提供单点登陆管理服务,进行账号,黑白名单、个性化、应用管理等配置

基于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() ;
}

# 其它