🎓 云南大学 CAS RESTful 对接文档

第三方应用接入云南大学统一身份认证系统完整指南

GitHub GitHub stars

📋 快速导航

📥 下载测试工具 📦 GitHub 仓库
✨ 测试工具特性:
  • 使用 Go 语言编写,无需安装任何依赖
  • 单文件可执行程序,下载即用
  • 支持 Windows、macOS、Linux 多平台
  • 支持标准流程(5步)和快速集成(2步)两种模式
  • 提供命令行配置功能,支持交互式配置和模板生成

一、标准 CAS RESTful 协议

1.1 什么是 CAS

CAS(Central Authentication Service,中央认证服务)是 Yale 大学发起的企业级单点登录(SSO)协议。RESTful 版本主要用于非浏览器客户端(如移动 App、单页应用、后端服务)。

1.2 核心票据类型

CAS 协议的核心是基于票据(Ticket)的认证机制。票据是由 CAS 服务器颁发的临时凭证,用于在客户端和应用服务之间传递认证信息,避免直接传输用户密码。

票据 全称 说明
TGT Ticket Granting Ticket 票据授权票据,用户登录凭证。用户首次认证成功后由 CAS 服务器颁发,相当于用户的"登录状态",可用于换取多个服务的 ST。
ST Service Ticket 服务票据,一次性访问凭证。每次访问不同应用时,需要用 TGT 换取对应的 ST,ST 只能使用一次且有效期很短。

1.3 标准 RESTful 认证流程

sequenceDiagram participant U as 客户端 participant CAS as CAS服务器 participant App as 应用服务 Note over U,CAS: 第一步:获取 TGT U->>CAS: POST /cas/v1/tickets
username + password CAS-->>U: 201 Created
返回 TGT Note over U,CAS: 第二步:获取 ST U->>CAS: POST /cas/v1/tickets/{TGT}
service=xxx CAS-->>U: 200 OK
返回 ST Note over U,App: 第三步:访问应用 U->>App: GET ?ticket=ST-xxx Note over App,CAS: 第四步:验证 ST App->>CAS: GET /cas/p3/serviceValidate
?service=xxx&ticket=ST-xxx CAS-->>App: XML 响应(用户信息) App-->>U: 登录成功

1.4 标准接口端点

端点 方法 用途
/cas/v1/tickets POST 申请 TGT
/cas/v1/tickets/{TGT} POST 使用 TGT 申请 ST
/cas/v1/tickets/{TGT} DELETE 销毁 TGT(登出)
/cas/p3/serviceValidate GET 验证 ST 并获取用户信息

1.5 标准接口示例

获取 TGT:

curl -X POST https://cas.example.com/cas/v1/tickets \
  -d "username=zhangsan" \
  -d "password=secret123"

获取 ST:

curl -X POST https://cas.example.com/cas/v1/tickets/TGT-xxx \
  -d "service=https://app.example.com"

验证 ST:

curl "https://cas.example.com/cas/p3/serviceValidate?service=https://app.example.com&ticket=ST-yyy"

二、云南大学 CAS 认证流程

2.1 与标准 CAS 的差异

云南大学采用金智教育 CIAP7.0 平台,在标准 CAS 协议基础上做了安全扩展:

特性 标准 CAS RESTful 云南大学 CAS(金智)
应用鉴权 无 需要 appId + accessToken
密码传输 明文 AES 加密(必选)
端点前缀 /cas/v1/... /authserver/v1/...
ST 有效期 通常较长 30秒且一次性
快速集成 无 支持 /v1/users 接口

2.2 服务器地址

云南大学 CAS 系统包含两个服务器,不同接口需要使用不同的服务器:

服务器 地址 用途
网关服务器 https://gateway.ynu.edu.cn 获取 accessToken、获取 TGT、获取 ST、销毁 TGT、快速获取用户信息
认证服务器 https://ids.ynu.edu.cn 仅用于验证 ST
⚠️ 重要:除了验证 ST 接口外,其他所有接口都必须通过网关服务器访问!

2.3 核心票据

票据 说明 有效期
accessToken 应用访问令牌 2小时
TGT 票据授权票据 可配置(通常8小时)
ST 服务票据 30秒,一次性
⚠️ 重要提示:
  • 密码传输前必须进行 AES 加密
  • ST 只有 30 秒有效期且只能使用一次
  • accessToken 请缓存复用,不要频繁获取

2.4 标准认证流程(5步)

sequenceDiagram participant App as 应用端 participant Gateway as 网关服务器 participant CAS as 认证服务器 Note over App,Gateway: 第1步:获取 accessToken(网关服务器) App->>Gateway: GET /token/gateway/accessToken
Header: appId + appSecret Gateway-->>App: 返回 accessToken(有效期2小时) Note over App,Gateway: 第2步:获取 TGT(网关服务器) App->>Gateway: POST /authserver/v1/tickets
Header: appId + accessToken
Body: username + AES加密密码 + service Gateway-->>App: 返回 TGT Note over App,Gateway: 第3步:获取 ST(网关服务器) App->>Gateway: POST /authserver/v1/tickets/{TGT}
Header: appId + accessToken
Body: service Gateway-->>App: 返回 ST(30秒有效) Note over App,CAS: 第4步:验证 ST(认证服务器) App->>CAS: GET /authserver/serviceValidate
?service=xxx&ticket=ST-xxx CAS-->>App: 返回用户信息(XML) Note over App,Gateway: 第5步:登出(网关服务器) App->>Gateway: DELETE /authserver/v1/tickets/{TGT}
Header: appId + accessToken Gateway-->>App: TGT 已销毁

2.5 快速集成流程(2步)

适用于移动端 App、后端服务等不需要 SSO 的场景:

sequenceDiagram participant App as 应用端 participant Gateway as 网关服务器 Note over App,Gateway: 第1步:获取 accessToken(网关服务器) App->>Gateway: GET /token/gateway/accessToken
Header: appId + appSecret Gateway-->>App: 返回 accessToken Note over App,Gateway: 第2步:直接获取用户信息(网关服务器) App->>Gateway: POST /authserver/v1/users
Header: appId + accessToken
Body: username + AES加密密码 + service Gateway-->>App: 返回用户信息(JSON)

2.6 AES 加密要求

⚠️ 密码传输前必须进行 AES 加密!
参数 值
算法 AES/CBC/PKCS5Padding
密钥长度 128位(16字节)
输出编码 Base64 + UTF-8

2.7 接口清单

接口 地址 服务器 说明
获取 accessToken GET /token/gateway/{appId}/accessToken 网关服务器 获取应用访问令牌
获取 TGT POST /authserver/v1/tickets 网关服务器 获取票据授权票据
获取 ST POST /authserver/v1/tickets/{TGT} 网关服务器 获取服务票据
验证 ST GET /authserver/serviceValidate 认证服务器 验证服务票据并获取用户信息
销毁 TGT DELETE /authserver/v1/tickets/{TGT} 网关服务器 销毁票据授权票据(登出)
快速获取用户信息 POST /authserver/v1/users 网关服务器 快速集成模式获取用户信息

三、使用测试工具

3.1 下载安装

无需安装任何依赖!直接从 Releases 下载对应平台的可执行文件:

Windows 用户:

# PowerShell
Invoke-WebRequest -Uri "https://github.com/na57/cas-restful-test/releases/latest/download/ynu-cas-test-windows-amd64.exe" -OutFile "ynu-cas-test.exe"

# 运行
.\ynu-cas-test.exe

macOS 用户:

# 下载
curl -L "https://github.com/na57/cas-restful-test/releases/latest/download/ynu-cas-test-darwin-amd64" -o ynu-cas-test
chmod +x ynu-cas-test

# 运行
./ynu-cas-test

Linux 用户:

# 下载
curl -L "https://github.com/na57/cas-restful-test/releases/latest/download/ynu-cas-test-linux-amd64" -o ynu-cas-test
chmod +x ynu-cas-test

# 运行
./ynu-cas-test

3.2 从源码编译

git clone https://github.com/na57/cas-restful-test.git
cd cas-restful-test
go build -o ynu-cas-test .
./ynu-cas-test

3.3 命令行配置

测试工具提供了便捷的命令行配置功能,无需手动编辑配置文件:

查看帮助:

./ynu-cas-test help

生成初始配置文件:

./ynu-cas-test configure init

该命令会生成一个包含默认值的配置文件模板 config.yaml,您可以直接编辑该文件填写必要信息。

交互式配置:

./ynu-cas-test configure

通过交互式问答方式配置所有参数,支持以下特性:

💡 提示:当运行测试程序但没有配置文件时,程序会提示您使用以上命令进行配置。

交互式配置示例:

📝 检测到现有配置文件,将保留现有值(直接回车使用默认值)

════════════════════════════════════════════════════════════
CAS服务器配置
════════════════════════════════════════════════════════════
认证服务器地址 [https://ids.ynu.edu.cn]: 
网关服务器地址 [https://gateway.ynu.edu.cn]: 

════════════════════════════════════════════════════════════
测试选项
════════════════════════════════════════════════════════════

测试模式
  [1] quick - 快速集成(2步)
  [2] standard - 标准流程(4步) ✓
请选择 [1-2] (默认: 2): 

是否在测试后登出
  [1] 是 - 测试后销毁TGT ✓
  [2] 否 - 保留TGT
请选择 [1-2] (默认: 1): 

显示详细请求信息
  [1] 是 - 显示详细请求信息 ✓
  [2] 否 - 只显示关键信息
请选择 [1-2] (默认: 1): 

✅ 配置文件已保存: config.yaml

3.4 手动配置

您也可以手动创建配置文件:

# 复制示例配置文件
cp config.example.yaml config.yaml

# 编辑 config.yaml
vim config.yaml

配置文件说明:

# CAS服务器配置
cas:
  # 认证服务器地址(仅用于验证ST)
  # 接口: /authserver/serviceValidate
  authHost: "https://ids.ynu.edu.cn"
  
  # 网关服务器地址(用于获取accessToken、TGT、ST、销毁TGT、快速获取用户信息)
  # 接口: 
  #   - /token/gateway/{appId}/accessToken (获取accessToken)
  #   - /authserver/v1/tickets (获取TGT)
  #   - /authserver/v1/tickets/{TGT} (获取ST、销毁TGT)
  #   - /authserver/v1/users (快速获取用户信息)
  gatewayHost: "https://gateway.ynu.edu.cn"

# 应用配置(从管控台获取)
app:
  appId: "你的应用ID"
  appSecret: "你的应用密钥"
  serviceUrl: "http://127.0.0.1/"

# AES加密配置(从管控台获取)
aes:
  key: "16字节AES密钥"
  iv: "16字节AES向量"

# 测试账号
test:
  username: "学号/工号"
  password: "密码"

# 测试选项
options:
  mode: "standard"    # "standard"(5步) 或 "quick"(2步)
  logout: true        # 最后是否销毁TGT
  verbose: true       # 是否显示详细请求信息

3.5 测试模式

标准流程(5步):

options:
  mode: "standard"

快速集成(2步):

options:
  mode: "quick"

3.6 输出示例

🚀 云南大学CAS认证测试工具

════════════════════════════════════════════════════════════
║ 云南大学CAS认证测试 - 标准流程
════════════════════════════════════════════════════════════
应用ID         : 1242483802708951040
测试用户       : 20080081
网关服务器     : https://gateway.ynu.edu.cn
认证服务器     : https://ids.ynu.edu.cn

[1/5] 获取accessToken
──────────────────────────────────────────────────
✅ 获取accessToken成功
Token          : 95eb04941302f98de86750a414a450f7...
有效期         : 2小时

[2/5] 获取TGT(票据授权票据)
──────────────────────────────────────────────────
✅ 获取TGT成功
TGT            : TGT-1-GC3mATQc9B8cslPImdF-r4-8M4E...

[3/5] 获取ST(服务票据)
──────────────────────────────────────────────────
✅ 获取ST成功
ST             : ST-4-cLnYlmqkNIfMXi0wGm0MMWn0r1c...
有效期         : 30秒(一次性使用)

[4/5] 验证ST并获取用户信息
──────────────────────────────────────────────────
✅ 验证ST成功,获取用户信息
用户ID         : 20080081

📋 用户属性:
   cn             : 张三
   sn             : 20080081
   mail           : [email protected]
   department     : 信息学院

[5/5] 登出(销毁TGT)
──────────────────────────────────────────────────
✅ TGT已销毁,登出成功

════════════════════════════════════════════════════════════
║ ✅ 测试完成
════════════════════════════════════════════════════════════

四、常见问题

4.1 获取 accessToken 返回错误

原因:appId 或 appSecret 错误

解决:核对管控台的凭据

4.2 获取 TGT 返回 400

原因:密码未正确加密或账号异常

解决:

4.3 验证 ST 返回 INVALID_TICKET

原因:ST 只有 30 秒有效期且只能使用一次

解决:获取 ST 后立即验证,不要重复使用

4.4 accessToken 频繁被拦截

原因:调用过频

解决:缓存 token,2 小时内复用

📚 相关资源