单点登录
1. 登录后提示 ticket 无效(30004/30005)
ticket 是一次性凭证且默认 5 分钟有效,勿重复使用(典型场景:页面刷新导致同一 ticket 提交两次)。同时确认客户端 secret-key 与平台登记的 appSecret 一致。出错时引导用户「重新登录」获取新 ticket。
详见:ticket模式
2. 提示 redirect_uri / redirect 不合法
回调地址必须与应用配置的白名单(oauth2 为 oauth2AllowRedirectUris、ticket 为 ssoAllowUrl)完全匹配:协议(http/https)、域名、端口、路径逐项核对。OAuth2 模式下,换 token 时传的 redirect_uri 还必须与发起授权时的一致——这也是前端需要用 sessionStorage 缓存回传 redirect_uri 的原因。
3. 提示 grant_type / 授权模式未开放
两级开关都要打开:平台全局配置 + 应用的「允许授权类型」(oauth2AllowGrantTypes)。联系平台管理员确认应用已签约目标授权模式。
详见:oauth2模式
4. code 换 token 失败
授权码 code 一次性且有效期很短:回调后应立即换 token;勿重复使用(页面刷新会导致同一 code 提交两次);换 token 的 redirect_uri 必须与授权时一致。失败后重新发起授权流程。
5. OAuth2 登录成功但提示用户不存在
OAuth2 模式以 openid 映射用户(本系统 sys_user.openid 字段),与 ticket 模式的 sso_id 是两个不同字段。需先通过事件回调(主数据同步)或手工方式将 openid 写入 sys_user,否则登录时匹配不到本地用户。
6. state 校验失败(缓存里取不到 state)
MDP 统一登录页是 hash 路由(.../#/oauth2/authorize?...),state 位于 hash 段的 query 中。URL.searchParams 只能解析 # 之前的内容,需手动解析:url.hash.split('?')[1] 再交给 URLSearchParams 取值。
7. 单点注销没有生效
按检查清单逐项确认:
- 应用配置
ssoPush已开启、ssoPushUrl正确指向客户端的pushC接口; pushC接口可被 MDP 服务端访问,且不被本系统鉴权拦截器拦截(必须匿名可访问,如路径含anyUser);- 集成 Spring Security 等非 sa-token 框架的系统,需在登出处理器中补充「通知 MDP 注销」与会话销毁逻辑;
- 单浏览器注销场景确认
deviceId正确传递与保存。
详见:ticket模式
8. 调 MDP 服务端接口提示 IP 不在白名单
检查应用配置的 allowIp:第三方应用应填服务器的外网出口 IP,只有与 MDP 处于同一内网的系统才填内网 IP。
详见:ticket模式
9. 微服务版客户端的 server-url 应该填哪个地址
OAuth2 与 SSO 接口都部署在 workbench-server:经内部网关访问填 http://inner-gateway地址/api/workbench(/api 是网关 context-path,/workbench 是路由前缀);单体版直接填 http://boot-server地址。
详见:单点登录客户端配置
10. 同一用户换了应用后 openid 不同
这是设计行为:openid 按应用隔离。需要跨应用识别同一用户时申请 unionid scope。
详见:oauth2模式
11. access_token 过期了怎么办
过期前用 refresh_token 调 /oauth2/refresh 换新;refresh_token 也过期则重新走授权流程。
详见:oauth2模式
12. 如何跳过授权确认页
平台侧将应用的「自动确认授权」打开即可。
高危配置
自动确认授权仅对可信应用开放,需平台管理员操作,不要在多租户/开放场景随意启用。
详见:oauth2模式