# 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;
}
}