ASP.NET Core部署Heroku时Google OAuth报400: redirect_uri_mismatch错误
这个问题的根因是Heroku使用反向代理架构,ASP.NET Core默认不会信任反向代理传递的原始请求协议(HTTPS)和主机头,导致Google OAuth中间件构造的回调地址和你在Google Cloud控制台配置的不一致,哪怕肉眼看起来完全相同。
步骤1:配置ForwardedHeaders中间件
这是反向代理环境下部署ASP.NET Core应用的必填配置,作用是让应用正确读取反向代理传递的X-Forwarded-Proto(原始请求协议)、X-Forwarded-For(原始请求IP)等头信息。
在Startup.cs的ConfigureServices方法中添加如下配置:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 清空已知代理/网络限制,适配Heroku的动态代理节点 options.KnownProxies.Clear(); options.KnownNetworks.Clear(); });
然后在Configure方法的最开头(必须排在UseAuthentication、UseHttpsRedirection等中间件之前)添加:
app.UseForwardedHeaders();
步骤2:显式指定Google OAuth回调路径
避免默认配置的隐藏问题,直接在AddGoogle配置中显式声明回调路径,和你在Google Cloud控制台配置的完全一致:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddGoogle(options => { var googleAuthNSection = configuration.GetSection("Google"); options.ClientId = googleAuthNSection["ClientId"]; options.ClientSecret = googleAuthNSection["ClientSecret"]; options.SignInScheme = IdentityConstants.ExternalScheme; // 显式指定回调路径,和Google Cloud控制台配置的完全一致 options.CallbackPath = "/signin-google"; });
步骤3:确认Google Cloud控制台配置完全匹配
再次检查授权重定向URI的每一个字符:
- 必须是完整地址,和报错信息中的
redirect_uri完全一致,不能多斜杠、少斜杠 - 协议必须是
https,不能是http - 大小写完全匹配
- 不要带任何查询参数
可选:禁用HTTPS重定向中间件
Heroku反向代理已经处理了HTTPS强制跳转,你可以删除UseHttpsRedirection中间件的配置,避免出现重定向循环。
配置完成后重新部署到Heroku即可解决问题。
内容的提问来源于stack exchange,提问作者igor igumenov
相关产品推荐
相关产品推荐

