具有第三方身份验证的 Web 代理

具有第三方身份验证的 Web 代理

我有一个典型的网站,用户必须付费才能注册并访问一些优质内容。这些内容是来自不同供应商的内部专有网络服务器(可以将其视为某些设备的图形管理界面)。

默认情况下,这些 Web 界面无法从外部访问,因此我必须在网站前面放置一个 Web 代理,以便根据 URL 代理请求。例如:

http://example.com --> ok (public server)
http://example.com/settings --> ok (public server)
http://example.com/resource1 ---> proxy to web server running on 10.0.0.20 (LAN)
http://example.com/resource2 ---> proxy to web server running on 10.0.0.30 (LAN)

例如,使用 HAProxy 或 nginx 非常简单。问题是,你不应该能够获得http://example.com/resource1无需登录主网站即可获取 URL,否则每个人无需注册即可从中受益。

主要问题是,我找不到任何方法可以从代理角度查看用户是否登录主网站。我在主网站中创建了一个 API,您可以在其中验证 cookie 是否为活动会话。我以为我可以以某种方式将其与代理一起使用,但我找不到方法。有什么建议吗?

答案1

您可以使用共享数据库和 cookies 来实现此目的。

工作流程可以如下:

  1. 未经身份验证的服务连接到http://example.com/resource1

  2. 每个 php 页面上添加的文件都会检查会话,检测未经身份验证的用户,并重定向到http://example.com/login.php

  3. 用户输入登录名/密码,会话密钥被添加到数据库。用户被重定向到http://example.com/resource1/?session=$PHPSESSIONID

  4. 步骤 2 中的同一文件根据数据库检查会话并验证用户。

答案2

使用 nginx,您可以根据子请求的结果允许或拒绝位置块中的访问。

location ~ /resource[1-2] {
    auth_request /authenticate;
}

如果子请求返回代码 2xx,则允许访问。如果子请求返回 401 或 403,则拒绝访问。

确保您的 nginx 二进制文件已经使用该--with-http_auth_request_module选项进行编译。

相关内容