授权服务器提示 At least one redirect_uri must be registered with the client,先查客户端注册;回调地址不断重定向,则要继续追客户端的过滤器链、会话和回调处理。两个错误可能前后出现,但不属于同一个检查点。

未注册回调:先确认是哪一个客户端

2019 年旧 Spring Security OAuth 项目返回:

error="invalid_request",
error_description="At least one redirect_uri must be registered with the client."

当时在授权服务器的客户端注册链上增加了:

.redirectUris("http://localhost:8082/ui/login")

它是旧 ClientDetailsServiceConfigurer 注册过程中的方法片段,不是完整配置。这里的本机地址仅用于理解历史案例;实际要登记应用真正使用的可信回调,确认请求的 client_id 对应这份运行时注册,而不是只改了未生效的配置文件。

还要对照请求中的协议、主机、端口、路径等完整地址。不要为解决不匹配而允许任意域名、通配前缀或由请求者随意指定的跳转目标。旧 DefaultRedirectResolver API 只是历史实现参照,不是推荐宽松匹配的依据。

回调已注册,仍可能陷入登录循环

第二天的故障是浏览器提示重定向次数过多:授权后回到客户端 redirect_uri,客户端又要求认证,再次发起授权。

授权服务器带回 code,并不等于客户端本地已经建立认证。典型检查顺序是:

  1. 查看脱敏跳转链,标出授权服务器、登录页、客户端回调与最终页面。
  2. 检查回调路径是否交给正确处理器,而不是再次被业务登录拦截。
  3. 核对会话 cookie、代理后的路径与协议,以及 state 是否能关联到原请求。
  4. 确认授权码只交换一次,成功后建立的是预期用户的本地上下文。

放行回调入口,不等于跳过回调校验

历史处理曾将多组首页和业务路径放入白名单。更稳妥的边界是只让协议所需入口进入对应处理流程,同时继续执行 state、授权码、客户端注册及可信回调校验,不把所有相似前缀都改为公开。

RFC 6749 §3.1.2 区分回调注册和授权请求中的地址使用;它不能替代应用自己的会话与过滤器链配置。若 code 已返回但客户端取令牌失败,可继续看 Provider 与客户端上下文。

这些配置属于已结束生命周期的旧 Spring Security OAuth。维护时固定实际依赖核查,不把历史白名单或自动批准配置移植为新系统默认值。