forked from admin/hair-keeper
添加北京大学统一认证接入支持skill
This commit is contained in:
78
.claude/skills/pku-iaaa/references/account-verify.md
Normal file
78
.claude/skills/pku-iaaa/references/account-verify.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# 北京大学账号验证
|
||||
|
||||
用于验证某个学号/职工号是否为有效的北京大学账号,不涉及登录流程。
|
||||
|
||||
## API
|
||||
|
||||
```
|
||||
GET https://iaaa.pku.edu.cn/iaaa/svc/pub/validate.do
|
||||
?userId={USERID}
|
||||
&userName={USERNAME}
|
||||
&appId={APPID}
|
||||
&msgAbs={MD5MSG}
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `userId` | 学号或职工号 |
|
||||
| `userName` | 账号姓名(传输时需 URLEncode,但计算 MD5 摘要时使用原始值,不做 URLEncode) |
|
||||
| `appId` | 应用 ID |
|
||||
| `msgAbs` | MD5 消息摘要 |
|
||||
|
||||
## msgAbs 计算
|
||||
|
||||
与其他端点规则一致:除 `msgAbs` 外所有参数按参数名升序排列拼接,再拼接 Key,取 MD5。
|
||||
|
||||
PARA_STR 排序后为:`appId={APPID}&userId={USERID}&userName={USERNAME}`
|
||||
|
||||
注意:`userName` 在 PARA_STR 中使用**原始值**(不做 URLEncode),只有在 URL 传输时才 URLEncode。
|
||||
|
||||
## 返回
|
||||
|
||||
**正常:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"valid": true,
|
||||
"userType": "用户身份类别"
|
||||
}
|
||||
```
|
||||
|
||||
`valid` 为 `true` 表示账号存在,`false` 表示不存在。
|
||||
|
||||
**异常:**
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"errCode": "错误代码",
|
||||
"errMsg": "错误信息"
|
||||
}
|
||||
```
|
||||
|
||||
## Python 示例
|
||||
|
||||
```python
|
||||
import hashlib
|
||||
import urllib.parse
|
||||
import requests
|
||||
|
||||
def verify_pku_account(user_id: str, user_name: str, app_id: str, key: str) -> dict:
|
||||
"""验证北大账号是否存在"""
|
||||
# msgAbs 中 userName 使用原始值
|
||||
para_str = f"appId={app_id}&userId={user_id}&userName={user_name}"
|
||||
msg_abs = hashlib.md5((para_str + key).encode('utf-8')).hexdigest()
|
||||
|
||||
# URL 中 userName 需要 URLEncode
|
||||
url = (
|
||||
f"https://iaaa.pku.edu.cn/iaaa/svc/pub/validate.do"
|
||||
f"?appId={app_id}"
|
||||
f"&userId={user_id}"
|
||||
f"&userName={urllib.parse.quote(user_name)}"
|
||||
f"&msgAbs={msg_abs}"
|
||||
)
|
||||
resp = requests.get(url, timeout=10)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
```
|
||||
120
.claude/skills/pku-iaaa/references/proxy-sso.md
Normal file
120
.claude/skills/pku-iaaa/references/proxy-sso.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 代理身份认证(Proxy SSO)
|
||||
|
||||
适用场景:应用 O(中心应用)登录后,用户点击进入应用 A、B、C(分支应用)时无需重新登录。
|
||||
|
||||
## 流程
|
||||
|
||||
```
|
||||
用户登录中心应用 O
|
||||
│
|
||||
├─ O 使用 validateWithProxy.do 验证 token → 获得 grantToken
|
||||
│
|
||||
├─ 用户点击分支应用 A
|
||||
│ ├─ O 调用 validateProxyGrantToken.do → 获得分支应用 A 的 token
|
||||
│ └─ 将 token 传给分支应用 A → A 用 validate.do 验证
|
||||
│
|
||||
└─ 用户退出中心应用 O
|
||||
└─ O 调用 expireProxy.do 注销 grantToken
|
||||
```
|
||||
|
||||
## API 详情
|
||||
|
||||
### 1. 中心应用验证(获取 grantToken)
|
||||
|
||||
```
|
||||
GET https://iaaa.pku.edu.cn/iaaa/svc/token/validateWithProxy.do
|
||||
?remoteAddr={REMOTE_ADDR}
|
||||
&appId={APP_ID}
|
||||
&token={TOKEN}
|
||||
&msgAbs={MSG_ABS}
|
||||
```
|
||||
|
||||
参数和 msgAbs 计算方式与标准 `validate.do` 相同。
|
||||
|
||||
**成功返回:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"errCode": "0",
|
||||
"errMsg": "认证成功",
|
||||
"userInfo": {
|
||||
"name": "用户姓名",
|
||||
"status": "账号状态",
|
||||
"identityId": "身份账号",
|
||||
"deptId": "所在院系码",
|
||||
"dept": "所在院系",
|
||||
"identityType": "身份类别",
|
||||
"detailType": "身份细类",
|
||||
"identityStatus": "身份状态"
|
||||
},
|
||||
"grantToken": "代理票据"
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 获取分支应用 Token
|
||||
|
||||
```
|
||||
GET https://iaaa.pku.edu.cn/iaaa/svc/token/validateProxyGrantToken.do
|
||||
?remoteAddr={REMOTE_ADDR}
|
||||
&appId={APP_ID}
|
||||
&targetAppId={TARGET_APP_ID}
|
||||
&grantToken={GRANT_TOKEN}
|
||||
×tamp={TIMESTAMP}
|
||||
&msgAbs={MSG_ABS}
|
||||
```
|
||||
|
||||
**参数:**
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `remoteAddr` | 客户端 IP |
|
||||
| `appId` | 中心应用 ID |
|
||||
| `targetAppId` | 分支应用 ID |
|
||||
| `grantToken` | 上一步获得的代理票据 |
|
||||
| `timestamp` | 当前时间戳(long 型整数) |
|
||||
| `msgAbs` | MD5 摘要,PARA_STR 为除 msgAbs 外所有参数按参数名升序拼接 |
|
||||
|
||||
注意:此端点参数较多,PARA_STR 排序后为:
|
||||
`appId={}&grantToken={}&remoteAddr={}&targetAppId={}×tamp={}`
|
||||
|
||||
**成功返回:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"errCode": "0",
|
||||
"errMsg": "验证成功",
|
||||
"token": "分支应用访问票据"
|
||||
}
|
||||
```
|
||||
|
||||
**错误码 12(需要手机验证):** 重定向用户到:
|
||||
```
|
||||
https://iaaa.pku.edu.cn/iaaa/ma4proxy.jsp
|
||||
?proxyAppId={中心应用ID}
|
||||
&appId={分支应用ID}
|
||||
&userId={用户账号}
|
||||
&grantToken={GRANT_TOKEN}
|
||||
&redirectUrl={分支应用回调地址,需URLEncode}
|
||||
```
|
||||
|
||||
### 3. 分支应用验证 Token
|
||||
|
||||
分支应用收到 token 后,使用标准 `validate.do` 或 `validateSimple.do` 验证,与普通认证流程相同。
|
||||
|
||||
### 4. 注销代理 Token
|
||||
|
||||
中心应用退出时或必要时调用:
|
||||
|
||||
```
|
||||
GET https://iaaa.pku.edu.cn/iaaa/svc/token/expireProxy.do
|
||||
?appId={APP_ID}
|
||||
&grantToken={GRANT_TOKEN}
|
||||
&msgAbs={MSG_ABS}
|
||||
```
|
||||
|
||||
msgAbs 的 PARA_STR:`appId={}&grantToken={}`(按参数名升序)
|
||||
|
||||
**返回:**
|
||||
```json
|
||||
{"success": true, "errCode": "0", "errMsg": "注销成功"}
|
||||
```
|
||||
Reference in New Issue
Block a user