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

5
我正在尝试使用Apache作为反向代理来设置Web服务器,连接到由kestrel托管的ASP.NET CORE Web应用程序。我遵循了这里的教程:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1 该网站使用Google Calendar Api获取用户的日历信息。当我通过Visual Studio使用Kestrel托管它时,这个功能可以正常工作。但是,当我尝试通过Web服务器进行身份验证并选择Google帐户时,我被重定向到 127.0.0.1:5000/signin-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时,它才能正常工作... 根据我的研究,这似乎几乎不可能。我将寻找其他授权和身份验证的实现选项。

你是否正在使用Google的OAuth2授权码流程?如果是,你在使用什么作为redirect_uri查询参数?可能你的Web服务器正在使用一些内部主机值而不是公共值。 - Trey Griffith
@TreyGriffith 我使用的库控制整个挑战(不需要帐户控制器发出挑战)。因此,我认为它也负责流程。似乎localhost:5000/signin-oidc是默认的重定向URI。我可以使用CallbackPath将其更改为localhost:5000/Controller/Action。但是,进一步研究表明,Google登录更受欢迎。 - JanseManse
3个回答

3

找到了解决方案!

在我的不懈搜索和新手的尝试中,我发现我已经删除了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。 - danish_wani

1

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;
                    },
                };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接