Apache 反向代理中的 Google OAuth 重定向 Uri

问题描述 投票:0回答:3

我正在尝试使用 Apache 作为连接到 kestrel 托管的 ASP.NET CORE Web 应用程序的反向代理来设置 Web 服务器。我已经按照这里的教程进行操作:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1

该网站使用 Google Calendar Api 获取用户日历信息。当我通过 Visual Studio 使用 Kestrel 托管它时,这工作正常。但是,当我尝试通过网络服务器验证并选择 Google 帐户时,我被重定向到

127.0.0.1:5000/登录-oidc

这不是想要的结果。 (127.0.0.1:5000 配置为 Apache 的 ProxyPass 和 ProxyReverse)。

由于在没有 Apache 反向代理的情况下运行 Web 应用程序,我怀疑 Apache 配置存在一些问题。但是,这也可能是我正在使用的 Google.Apis.Auth.AspNetCore3 库的问题。我使用 集成测试 作为如何设置 startup.cs 以及如何发出 Api 请求的指南。

编辑:

所以我问了我正在使用的库的开发人员。重定向 uri 绑定到我监听的 kestrel 的端点。问题在这里:https://github.com/googleapis/google-api-dotnet-client/issues/1680

所以它只有在我能以某种方式让 kestrel 知道我的服务器的“实际”域名或公共 IP 时它才能工作......根据我的研究,这似乎是接近的,如果不是不可能的话。我将研究授权和身份验证的其他实现选项。

apache asp.net-core google-oauth
3个回答
3
投票

找到解决方案了!

在我无尽的搜索和笨拙中,我发现我已经删除了我的 VirtualHost for apache 的前向标头。我还添加了 ProxyPreserveHost 选项。

我更改了虚拟主机以包含

RequestHeader set X-Forwarded-Proto https
ProxyPreserveHost On
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
ServerName www.example.com
ServerAlias *.example.com

1
投票
RequestHeader set X-Forwarded-Proto https
ProxyPreserveHost On

添加以上两个指令就可以了

参考资料:

ProxyPreserveHost On

RequestHeader 设置 X-Forwarded-Proto https


0
投票

如果你使用的是net core,给虚拟主机添加正确的配置是不够的,你需要添加

    app.UseForwardedHeaders(new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        });
        
        app.Use((context, next) =>
        {
            if (context.Request.Headers.TryGetValue("X-Forwarded-Proto", out var protoHeaderValue) &&
                protoHeaderValue == "https")
            {
                context.Request.Scheme = "https";
            }
            return next();
        });

.AddGoogle(options =>
            {
                    OnRedirectToAuthorizationEndpoint = context =>
                    {
                        context.Response.Redirect(context.RedirectUri.Replace("http://", "https://", StringComparison.OrdinalIgnoreCase));
                        return Task.CompletedTask;
                    },
                };
© www.soinside.com 2019 - 2024. All rights reserved.