Cloud Run部署Spring Boot应用:getRequestURI返回http致Auth0令牌交换失败
这问题其实和Cloud Run的网络架构直接相关,我来帮你拆解清楚:
Google Cloud Run的外部请求是通过Google全球负载均衡器(GLB)处理的,GLB会先终结HTTPS连接,然后以HTTP协议将请求转发到你的容器实例(默认是8080端口)。所以你的Spring Boot应用接收到的请求本身就是http的,哪怕用户外部访问用的是https。
不过你已经看到Nginx里有X-Forwarded-Proto = https这个头部——这是负载均衡器用来告诉后端应用原始请求协议类型的,但Spring Boot默认不会自动识别并使用这些反向代理头部,这就是为什么getRequestURI()返回http的核心原因。
解决步骤:
配置Spring Boot识别转发头部
在你的Spring Boot配置文件(application.properties或application.yml)中添加以下配置:# Spring Boot 2.2+ 推荐使用NATIVE策略,利用容器的原生支持 server.forward-headers-strategy=NATIVE # 若需要更细粒度控制,可切换为FRAMEWORK策略启用内置的ForwardedHeaderFilter # server.forward-headers-strategy=FRAMEWORK这个配置会让Spring Boot读取
X-Forwarded-Proto、X-Forwarded-For等头部,自动将请求的协议、客户端IP等信息替换为原始请求的真实值。验证配置生效
配置完成后重新部署你的Cloud Run服务,此时HttpServletRequest.getRequestURI()应该会返回带https的地址,Auth0的令牌交换错误也会随之解决。额外注意
确保你的Auth0应用配置中的回调URL是https开头的(比如https://your-cloud-run-service-url.com/callback),这和Spring的配置配合才能完整走通认证流程。
内容的提问来源于stack exchange,提问作者alex tolkachev

