# CAS接口版应用集成

# 6.1 接口接入说明

# 6.1.1 获取service ticket(ST)

请求头:header
Authorization: 值在页面登陆后,任意查看一个接口复制

地址:
http(s)://{host}:{port}/api/auth/cas/login?clientId=81699abe-c975-4a8d-bf6f-0a015568422e&redirectUri=http://192.168.97.163:8082/callback

说明:

  • clientId:需要在认证后台注册系统分配
  • redirectUri:为注册系统时填写的跳转链接,用于处理service
  • ticket,登录成功后,系统会生成service ticket,自动跳转到redirectUri?ticket=ST,例如:
http://192.168.97.163:8082/callback?ticket=ff3ea52ca7394b028628b2b012238ad6

# 6.1.2 接入系统服务端使用service ticket(ST)换取AccessToken

接入的Web应用应在获取到ticket之后,向如下地址发送POST请求: http(s)://{host}:{port}/api/auth/cas/token

Json body:

{
   "clientId": "81699abe-c975-4a8d-bf6f-0a015568422e",
   "clientSecret": "d440049d-1b1a-49ba-8f56-0920bc83b9b2",
   "ticket": "F19353585910571175D17A0F9B2ACA28"
}
参数名 描述 类型 为空 备注
ticket 填写ticket String 必填 由第一步回调地址参数获得
clientId 开发者使用api唯一标识 String 必填 认证系统分配
clientSecret 与clientId对应的秘钥 String 必填 认证系统分配

返回结果:

{
   "code": 0,
   "data": {
      "accessToken": "f33fbb0be5c94d51b2ea3e23ad214175",
      "expiredIn": 3600,
      "scope": "all",
      "refreshToken": "0a775950fd9f463093bdcc2fa8e4cf76",
      "tokenType": "header"
   }
}

错误返回:

{
   "msg": "无效的service ticket:e09715810ae641a6bb086d72a91b344!",
   "code": 10001
}
常见错误码 描述
10001 无效的service ticket:%s!
10002 无效的client id:%s!
10003 回调链接(redirectUri)无效:%s!
10004 Client Secret:%s 校验失败!
10005 无效的Access Token: %s!

# 6.1.3 获取用户信息(HTTP GET)

接口地址:

http(s)://{host}:{port}/api/auth/profile

请求头:

参数名 描述 类型 为空
3rd-party-ac-token 第二步获取的token String 必填

返回值

参数名 描述
code 返回标识(0.正常 500.错误)
msg 操作信息
data.userId 用户id
data.sex 用户性别
data.avatar 头像地址
data.username 用户工号
data.nick 用户姓名
data.status 账号状态(0.启用 1.禁用)
data.phonenumber 手机号
data.email 邮箱
data.role.id 角色id
data.role.name 角色名称
data.role.code 角色代码(xs:学生,js:教师,子应用管理员:sub_application_manager,院系(单位)管理员:college_manage,游客:sys:visitor,开发商:sys:kfs)
data.role.deptId 部门id
data.role.deptCode 部门代码
data.role.deptName 部门名称

返回示例

{
  "code": 0,
  "msg": "请求成功",
  "data": {
    "userId": 47261,
    "sex": "男",
    "avatar": "",
    "username": "jc_data",
    "nick": "集成-数据中台",
    "status": "0",
    "phonenumber": "13888888888",
    "email": "xxxx@qq.com",
    "role": {
      "id": 1,
      "name": "学生",
      "code": "xs",
      "deptId": 1054,
      "deptCode": "0",
      "deptName": "半云学院"
    }
  }
}

错误示例:

{
   "msg": "无效的Access Token: 218204ed282249f6baead992a5297db!",
   "code": 10005
}

# 5.1.4 退出登陆

调用地址:

http(s)://{ip}:{port}/api/auth/user/logout	get

请求头:

3rd-party-ac-token: 由cas/oauth2接口获取用户access-token

返回值

参数名 描述
code 返回标识(0.正常)
msg 操作信息
data 返回信息

返回示例

{
   "code": 0,
   "msg": "请求成功",
   "data": null
}

# 6.1.5 Token校验

调用地址:

http(s)://{ip}:{port}/api/auth/valid/token	post

请求体(form data)

参数名 描述 类型 为空 备注
accessToken 登陆凭证 String 必填 由cas/oauth2接口获取用户access-token

返回值

参数名 描述
code 返回标识(0.正常)
msg 操作信息
data 返回信息

返回正确示例

{
   "code": 0,
   "msg": "请求成功",
   "data": null
}

返回错误示例

{
   "msg": "无效的Access Token: 0d0418da545746639c63da18df56d8f21!",
   "code": 10005
}

# 6.2 Java回调方法示例


@RestController
public class CasCallback {

   private final AuthConfig authConfig;
   private final AuthClient authClient;

   public CasCallback(AuthConfig authConfig, AuthClient authClient) {
      this.authConfig = authConfig;
      this.authClient = authClient;
   }

   /**
    * cas 处理ticket 回调接口
    *
    * @param ticket 由认证系统转发的service ticket
    * @return Resp<?>
    */
   @GetMapping("/cas/callback")
   public Resp<?> stCallback(@RequestParam("ticket") String ticket) {

      AuthClientConfig casClientConfig = authConfig.getCas();

      // step 1. ticket 换取用户access token
      Ticket2TokenReq req = new Ticket2TokenReq();
      req.setClientId(casClientConfig.getClientId());
      req.setClientSecret(casClientConfig.getClientSecret());
      req.setTicket(ticket);
      Resp<AccessTokenInfo> accessTokenInfoResp = authClient.casTicketToAccessToken(req);

      // step 2. access token 换取用户信息
      if (RespUtil.success(accessTokenInfoResp)) {
         AccessTokenInfo accessTokenInfo = accessTokenInfoResp.getData();
         CurrentRequest.setAccessToken(accessTokenInfo.getAccessToken());

         // step 3. 跳转到自己的系统(请自行处理)
         return authClient.profile();
      }

      return accessTokenInfoResp;

   }


}