96de0228714b9e4323fc4a1886fa08eada58697b
核对前端源码发现两者的获取路径是分开的:
getOAuthToken: setToken(m.data.data?.access_token) // 只管 token
getUserInfo: POST /auth/user → data.role.roleId // roleId 在这里
axios 拦截器: s.headers.roleId = JSON.parse(getCurrentRole()).roleId
s.headers.Authorization = getToken() // 原文,无 Bearer 前缀
我们原先在同一处只读 cas/callback 的 data.userInfo.roleId。
若该校响应不含该嵌套结构,RoleID 会为空,导致:
- 所有后续请求缺少 roleId 头;
- 学校端可能直接拒绝,且报错信息不会指向真正原因。
改动:
- 登录成功后主动 POST /api/auth/user 取 data.role.roleId(roleName 同步);
- 该调用失败不阻断(slog.Warn 后沿用 cas 响应的值),保持向后兼容;
- 两者都拿不到 roleId 时才明确报错「未能获取角色信息」,
避免带着空 roleId 一路请求到被学校端拒绝;
- realName 缺失时回退 xm(国内学工系统常见字段名)。
顺带核实两处未被验证过的契约,结论是现有实现正确、无需改动:
- Authorization 头是 token 原文,不加 Bearer 前缀;
- RoleID 与前端 getCurrentRole().roleId 语义一致。
测试:/auth/user 的路径与 POST 方法、role/roleName/realName 解析、
realName 缺失回退 xm、非 0 code 必须报错。
Description
No description provided
Languages
Go
58.2%
Vue
35.3%
TypeScript
4.1%
CSS
1.5%
JavaScript
0.6%
Other
0.2%