Cloud Run上Spring Boot应用AD认证后重定向失败:AADSTS500112错误
问题概述
部署在Cloud Run的Spring Boot应用完成AD认证后无法正常重定向,报错显示回调地址协议不匹配:配置的是HTTPS,但实际请求时使用了HTTP地址。
已配置的application.properties重定向地址:
aad.redirectHomeUri=https://icaps-userhelpertool-dev-cloudrun-kwyk47pogq-ez.a.run.app/resetpassword
且该地址已同步配置在Azure AD应用注册中,但认证后出现以下错误:
19-01-2023 10:08:07.259 ERROR c.m.a.m.ConfidentialClientApplication - [Correlation ID: b396dc37-982d-4f56-ac5d-a754f24f4f53] Execution of class com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier failed.
com.microsoft.aad.msal4j.MsalServiceException: AADSTS500112: The reply address 'http://icaps-userhelpertool-dev-cloudrun-kwyk47pogq-ez.a.run.app/resetpassword' does not match the reply address 'https://icaps-userhelpertool-dev-cloudrun-kwyk47pogq-ez.a.run.app/resetpassword' provided when requesting Authorization code.
原因
Cloud Run作为反向代理,会将外部的HTTPS请求转换为HTTP转发给后端应用。Spring Boot默认不会识别代理传递的X-Forwarded-Proto头,导致应用生成的回调地址使用HTTP协议,与Azure AD中配置的HTTPS地址不匹配。
解决步骤
1. 配置Spring Boot识别代理头部
在application.properties中添加以下配置,让Spring正确识别原始请求的协议:
# 启用原生转发头处理(Spring Boot 2.2+) server.forward-headers-strategy=NATIVE # 针对Tomcat容器的额外兼容配置 server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto
2. 强制MSAL使用HTTPS回调地址
如果使用MSAL4J库,确保在构建ConfidentialClientApplication时,显式指定HTTPS的重定向URI,避免从请求上下文自动获取HTTP地址:
ConfidentialClientApplication app = ConfidentialClientApplication.builder( clientId, ClientCredentialFactory.createFromSecret(clientSecret)) .authority(authority) .redirectUri("https://icaps-userhelpertool-dev-cloudrun-kwyk47pogq-ez.a.run.app/resetpassword") .build();
3. 验证Azure AD配置
再次确认Azure AD应用注册中的重定向URI完全匹配配置的HTTPS地址,包括协议、域名和路径,无拼写或大小写错误。
内容的提问来源于stack exchange,提问作者Dipesh Agrawal

