# 代理身份认证(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": "注销成功"} ```