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

Spring集成MSAL配置多授权客户端时出现AADSTS65001错误如何解决

问题根因

报错AADSTS65001本质是权限同意缺失:用户首次交互式登录授权时,Azure AD仅收到了其中一个下游API的权限申请,第二个API的scope未包含在初始授权请求中,Azure AD没有对应的用户同意记录,后续应用尝试获取第二个API的访问令牌时就会触发该错误。单客户端配置时,授权请求默认会携带该客户端的scope,因此运行正常。

解决方案
  • 方案1:登录时统一申请所有scope(最常用,无需调整Azure配置)
    可以直接修改配置文件,在全局scope配置项中添加两个客户端的所有权限,登录时会一次性申请所有权限,用户同意后两个客户端都可以正常获取令牌:
azure:
  activedirectory:
    tenant-id: ${TENANT_ID}
    client-id: ${CLIENT_ID}
    client-secret: ${CLIENT_SECRET}
    # 新增全局scope配置,登录时统一申请所有需要的权限
    scopes:
      - ${CALENDAR_SCOPE}
      - ${AZURE_SCOPE}
    authorization-clients:
      calendar-api:
        scopes:
        - ${CALENDAR_SCOPE}
      azure-api:
        scopes:
        - ${AZURE_SCOPE}

如果需要更灵活的权限控制,也可以修改Spring Security配置类自定义授权请求:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http, ClientRegistrationRepository clientRegistrationRepository) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .oauth2Login(oauth2 -> oauth2
                .authorizationEndpoint(authz -> authz
                    .authorizationRequestResolver(customRequestResolver(clientRegistrationRepository))
                )
            );
        return http.build();
    }

    private OAuth2AuthorizationRequestResolver customRequestResolver(ClientRegistrationRepository clientRegistrationRepository) {
        DefaultOAuth2AuthorizationRequestResolver resolver = new DefaultOAuth2AuthorizationRequestResolver(
            clientRegistrationRepository,
            OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI
        );
        // 追加所有需要的scope到授权请求
        resolver.setAuthorizationRequestCustomizer(customizer -> customizer
            .scope(scopes -> {
                scopes.add(System.getenv("CALENDAR_SCOPE"));
                scopes.add(System.getenv("AZURE_SCOPE"));
            })
        );
        return resolver;
    }
}
  • 方案2:开启增量同意
    如果不希望一次性申请所有权限,可以在Azure门户的应用注册页面开启「增量同意」功能,应用在需要获取第二个API的令牌时会自动弹出授权页面,引导用户补全权限同意。该方案仅适合有用户交互的场景,后台无交互的服务间调用场景不可用。
  • 方案3:管理员全局预授权
    如果是企业内部租户使用的应用,可以联系租户管理员在Azure门户的应用注册页,直接为整个租户授予两个API对应的所有权限,所有用户登录时无需手动同意即可获取两个API的访问令牌,从根源避免该类报错。
验证步骤

修改配置后清空浏览器缓存和现有授权会话,重新触发登录流程,确认授权页面同时展示了两个API的权限申请,登录成功后分别调用两个下游API验证令牌获取是否正常即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:45:04