You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot OAuth2客户端授权回调后调用资源接口返回401异常

问题根因

你的401异常核心原因是OAuth2客户端管理器配置错误,和issuer-uri末尾斜杠问题没有直接关联:

  • 你当前使用的AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager仅适用于无用户上下文的服务端后台调用场景(比如定时任务、服务间离线调用),它不会自动从当前用户会话/请求上下文里读取授权完成后存储的访问令牌,也不会自动触发授权码换令牌的流程,最终你调用业务API时请求里根本没有携带有效访问令牌,直接触发401。
  • 你存在scope配置不一致的隐患:yaml配置中声明的scope是pr.pro、pr.act,但Java代码里硬编码的scope是m3p.f.pr.pro、m3p.f.pr.act,如果授权服务器开启严格scope校验,即便拿到令牌也会因为权限范围不匹配被拒绝。
  • 你在浏览器控制台看不到令牌请求是正常现象:授权码换令牌是后端服务直接向授权服务器令牌端点发起的服务端请求,不会经过浏览器,自然不会出现在浏览器网络面板里。
  • issuer-uri斜杠问题和当前401无关:你当前代码中已经注释掉了issuerUri的配置逻辑,该参数根本没有生效,不会影响令牌获取和接口调用流程。
修复方案
  1. 替换WebClient的OAuth2授权管理器配置,使用适配请求上下文的实现,正确代码如下:
    @Bean
    WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations,
                        ServerOAuth2AuthorizedClientRepository authorizedClientRepository) {
        DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager =
                new DefaultReactiveOAuth2AuthorizedClientManager(clientRegistrations, authorizedClientRepository);
        ServerOAuth2AuthorizedClientExchangeFilterFunction oauthFilter =
                new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
        oauthFilter.setDefaultClientRegistrationId("localhost-for-development-3");
        return WebClient.builder().filter(oauthFilter).build();
    }
    
  2. 统一scope配置:不要同时在yaml和Java代码中分别配置scope,保证配置的scope值和授权服务器后台为该客户端分配的权限范围完全一致。
  3. 调整日志配置,开启Spring Security OAuth2的DEBUG日志,方便排查令牌交互流程,在yaml中添加如下配置:
    logging:
      level:
        org.springframework.web: DEBUG
        org.springframework.security.oauth2: DEBUG
    
排查步骤

重启应用后按以下顺序排查,不需要查看浏览器控制台:

  • 查看用户授权后回调到/login/oauth2/code/{registrationId}端点的日志,确认后端是否收到了合法的授权码
  • 确认后端收到授权码后,是否向配置的token-uri发起了POST换令牌请求,以及令牌端点返回的响应状态码:如果返回4xx,根据错误提示排查客户端密钥、重定向URI、授权码有效性问题;如果返回200,确认响应中是否包含有效access_token
  • 查看调用业务API的请求日志,确认请求头中是否携带了Authorization: Bearer <access_token>,如果没有该请求头,说明授权过滤器配置仍有问题
  • 如果请求携带了令牌仍返回401,将access_token解析后检查issuer、受众、scope、过期时间等字段,确认和API提供方的要求匹配。
关于issuer-uri末尾斜杠问题的处理

该问题不会影响当前的授权码模式流程:

  • 如果你不需要使用OIDC自动发现能力,只要手动配置好授权端点、令牌端点、JWK集地址、用户信息端点,完全可以不配置issuer-uri,直接绕开Spring Security的issuer格式校验
  • 如果需要启用OIDC自动发现,不要直接使用Builder的默认赋值逻辑,手动将去掉末尾斜杠的issuer地址传入ClientRegistration即可。

内容的提问来源于stack exchange,提问作者LosmiNCL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:27:18