Google API Gateway后Quarkus原生应用JWT认证401及OPTIONS 405问题
解决方案:Quarkus + Cloud Run + API Gateway 401认证失败及OPTIONS 405问题
一、解决401认证失败问题
可能原因及对应方案:
API Gateway未正确转发Authorization头
- 检查API Gateway的OpenAPI配置,确保未移除或修改
Authorization请求头。确认网关后端配置(x-google-backend)正确指向Cloud Run服务,且保留所有请求头规则。 - 验证方式:查看Cloud Run日志中的
Authorization头是否与Postman发送的一致,若头丢失或篡改,调整网关配置。
- 检查API Gateway的OpenAPI配置,确保未移除或修改
Cloud Run原生应用无法访问外部JWKS地址
- 尽管无网关时正常,但网关可能引入出站网络限制。可将JWKS密钥本地化规避:
- 访问
https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com,保存内容为src/main/resources/jwks.json。 - 修改
application.properties配置:mp.jwt.verify.publickey.location=classpath:jwks.json - 重新构建原生镜像并部署到Cloud Run,验证认证流程是否恢复正常。
- 访问
- 尽管无网关时正常,但网关可能引入出站网络限制。可将JWKS密钥本地化规避:
SmallRye JWT原生模式缓存异常
- 日志显示刷新JWKS Set后仍无法匹配
kid,可能是原生模式下JWKS缓存异常。尝试调整缓存配置:smallrye.jwt.jwks.refresh-interval=300 smallrye.jwt.jwks.cache-size=0
- 日志显示刷新JWKS Set后仍无法匹配
二、解决OPTIONS 405错误(CORS问题)
在application.properties中添加Quarkus CORS配置:
quarkus.http.cors.enabled=true quarkus.http.cors.origins=https://your-frontend-domain.com # 替换为实际前端域名,或用*临时测试 quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS quarkus.http.cors.headers=Authorization,Content-Type,Accept quarkus.http.cors.exposed-headers=Location,Content-Length
配置完成后重启Cloud Run服务,前端OPTIONS预检请求将被正确处理。
额外验证步骤
- 直接用Postman请求Cloud Run服务地址(绕过网关),确认服务本身认证逻辑正常。
- 检查API Gateway日志,确认请求头完整转发至Cloud Run。
- 若使用VPC连接器,确保Cloud Run出站流量可访问Google API域名。
内容的提问来源于stack exchange,提问作者mdconsulting
相关产品推荐
相关产品推荐

