Files
hair-keeper/.claude/skills/pku-iaaa/references/proxy-sso.md

3.1 KiB
Raw Blame History

代理身份认证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 相同。

成功返回:

{
  "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}
    &timestamp={TIMESTAMP}
    &msgAbs={MSG_ABS}

参数:

参数 说明
remoteAddr 客户端 IP
appId 中心应用 ID
targetAppId 分支应用 ID
grantToken 上一步获得的代理票据
timestamp 当前时间戳long 型整数)
msgAbs MD5 摘要PARA_STR 为除 msgAbs 外所有参数按参数名升序拼接

注意此端点参数较多PARA_STR 排序后为: appId={}&grantToken={}&remoteAddr={}&targetAppId={}&timestamp={}

成功返回:

{
  "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.dovalidateSimple.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_STRappId={}&grantToken={}(按参数名升序)

返回:

{"success": true, "errCode": "0", "errMsg": "注销成功"}