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
相关产品推荐
相关产品推荐

