负载均衡下Google OAuth 2.0回调为http被拒如何修改redirect_url协议
解决负载均衡后Google OAuth 2.0回调协议不匹配问题
问题根因
你遇到的两个报错都是反向代理场景下的典型问题:
- 初始Google安全策略报错:Google近期收紧了OAuth回调校验规则,要求请求携带的
redirect_uri必须和控制台配置的完全一致。由于负载均衡到后端服务走http协议,后端服务默认用当前请求的http协议生成回调地址,和控制台配置的https协议地址不匹配,因此被驳回。 - 后续
https:///开头的错误重定向:你手动全局修改了请求Scheme为https,但没有同步配置请求的Host值,导致生成重定向地址时域名部分为空,出现了三个斜杠的错误格式。
可行解决方案
方案一:自定义Google认证事件(最稳妥,不影响全局业务)
直接在Google OAuth配置中拦截授权重定向逻辑,手动修正回调地址的协议和域名,不需要修改全局请求配置:
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() { ClientId = googleKey, ClientSecret = googleSecret, CallbackPath = new PathString("/signin-google"), // 仅填写相对路径即可 Events = new OAuth2AuthenticationEvents { OnRedirectToAuthorizationEndpoint = context => { // 替换回调地址的协议和域名为实际公网值 var uriBuilder = new UriBuilder(context.RedirectUri); uriBuilder.Scheme = "https"; uriBuilder.Host = "ourwebsite.com"; context.RedirectUri = uriBuilder.Uri.ToString(); return Task.CompletedTask; } } });
方案二:全局配置转发头(标准解法,适合所有反向代理场景)
先确保负载均衡配置了以下两个透传头:
X-Forwarded-Proto:值为原始请求的协议,公网https请求该值固定为httpsX-Forwarded-Host:值为原始请求的域名,即ourwebsite.com
然后在Startup.Auth.cs最开头(所有中间件注册之前)添加转发头处理配置,以ASP.NET Core为例:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost });
如果是OWIN架构的ASP.NET Framework项目,也可以用以下简单配置代替:
app.Use((ctx, next) => { // 优先取转发头的协议和域名,没有的话再硬编码兜底 ctx.Request.Scheme = ctx.Request.Headers.Get("X-Forwarded-Proto") ?? "https"; ctx.Request.Host = new HostString(ctx.Request.Headers.Get("X-Forwarded-Host") ?? "ourwebsite.com"); return next(); });
校验注意事项
配置完成后需要确认:
- Google云控制台OAuth配置页的
redirect_url确实为https://ourwebsite.com/signin-google,完全匹配无尾斜杠、大小写差异 - OAuth同意屏幕的域名已加入授权列表,无待完成的验证项
内容的提问来源于stack exchange,提问作者Matt Burland
相关产品推荐
相关产品推荐

