Asp.Net Core 7 MVC应用部署在Nginx反向代理后Google认证失效,报invalid_client错误
Asp.Net Core 7 MVC应用部署在Nginx反向代理后Google认证失效,报invalid_client错误
看起来你遇到的是Google OAuth认证里很常见的invalid_client错误,我帮你梳理几个大概率的排查方向,你可以一步步试:
1. 先核对Google开发者控制台的核心配置
这是最容易踩坑的环节:
- Client ID/Secret是否完全匹配:检查部署环境里的
CLIENT_ID和CLIENT_SECRET,和Google控制台生成的内容是不是一模一样——别小看复制粘贴时的空格、大小写遗漏,这些细节都会直接触发invalid_client。 - 重定向URI是否精确配置:确保在Google控制台的OAuth 2.0客户端ID设置中,已经添加了
https://myapp.mydomain.com/signin-google,注意必须是https协议,路径拼写完全不能错,哪怕多一个斜杠或者拼错单词都不行。
2. 确保Asp.Net Core正确识别反向代理的HTTPS请求
你的Nginx已经配置了X-Forwarded-Proto头,但Asp.Net Core默认不会信任反向代理的转发头,导致它会认为当前请求是HTTP协议,进而向Google发送HTTP格式的回调URI,这和你控制台里配置的HTTPS URI不匹配,就会触发错误。解决方法如下:
在Program.cs里添加转发头配置,必须放在认证中间件之前:
// 配置转发头选项 builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 信任Nginx的IP,本地反向代理填127.0.0.1,生产环境建议填写Nginx服务器的具体IP options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); }); // ...其他服务配置代码... var app = builder.Build(); // 必须在UseAuthentication、UseAuthorization之前调用 app.UseForwardedHeaders(); // ...其他中间件(如UseStaticFiles、UseRouting等)... app.UseAuthentication(); app.UseAuthorization();
3. 明确指定Google认证的回调路径
有时候Asp.Net Core在反向代理环境下会自动生成错误的回调路径,你可以手动指定来规避这个问题:
builder.Services.AddAuthentication() .AddCookie(x => { x.CookieManager = new CookieManagerWrapper(); x.Cookie.SameSite = SameSiteMode.None; x.Cookie.HttpOnly = true; x.Cookie.SecurePolicy = CookieSecurePolicy.Always; }) .AddGoogle(opt => { opt.ClientId = builder.Configuration["CLIENT_ID"]!; opt.ClientSecret = builder.Configuration["CLIENT_SECRET"]!; // 明确指定回调路径,和Google控制台的配置保持完全一致 opt.CallbackPath = "/signin-google"; });
4. 验证配置是否正确加载
在开发模式下,你可以临时添加一行输出,确认程序是否正确读取到了CLIENT_ID和CLIENT_SECRET:
Console.WriteLine($"Loaded Client ID: {builder.Configuration["CLIENT_ID"]}"); Console.WriteLine($"Loaded Client Secret: {builder.Configuration["CLIENT_SECRET"]}");
如果输出为空或者内容不对,那就是配置文件没部署到位,或者环境变量没设置正确,这时候需要先解决配置加载的问题。
按照这个顺序排查,大概率能解决问题,我之前处理过类似的反向代理下OAuth认证失效的情况,大多是转发头未配置或者Google控制台的URI写错导致的。
备注:内容来源于stack exchange,提问作者Joseph Izang
相关产品推荐
相关产品推荐

