我们的应用程序由几个部分组成。每个部分都在其子域(nginx 站点)上运行。我们希望将开发环境的访问权限隐藏在某些共享身份验证后面,这样首次登录任何子域的用户都将获得访问权限。
我们的第一个想法是将包含所有域的 nginx 代理站点放在前面,并在那里设置基本身份验证,然后代理传递通信。部分方法是可行的。问题是基本身份验证与域名绑定,因此在登录一个子域后,我必须在第一次访问时为每个子域输入凭据。
我们使用了简化的示例配置,但它并没有按照预期的方式工作。
server {
listen 443 ssl http2;
server_name paapi-xy.example.com;
access_log /var/www/access_api_443.log;
error_log /var/www/error_api_443.log debug;
ssl_certificate /etc/ssl/example/example.com.chained.crt;
ssl_certificate_key /etc/ssl/example/example.com.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
root /var/www/html;
location / {
try_files $uri /index.api.html;
}
}
server {
listen 443 ssl http2;
server_name pawww-xy.example.com;
access_log /var/www/access_www_443.log;
error_log /var/www/error_www_443.log debug;
ssl_certificate /etc/ssl/example/example.com.chained.crt;
ssl_certificate_key /etc/ssl/example/example.com.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
root /var/www/html;
location / {
try_files $uri /index.www.html;
}
}
server {
listen 443 ssl http2;
server_name paapi.example.com pawww.example.com;
access_log /var/www/access_proxy_443.log;
error_log /var/www/error_proxy_443.log debug;
ssl_certificate /etc/ssl/example/example.com.chained.crt;
ssl_certificate_key /etc/ssl/example/example.com.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
root /var/www/html;
set $xheader "someignoredvalue";
location / {
satisfy any;
auth_basic example_auth;
auth_basic_user_file /var/www/.htpasswd;
include proxy_params;
if ($host = paapi.example.com) {
proxy_pass https://paapi-xy.example.com;
set $xheader paapi-xy.example.com;
}
if ($host = pawww.example.com) {
proxy_pass https://pawww-xy.example.com;
set $xheader pawww-xy.example.com;
}
proxy_set_header Host $xheader;
}
}
有谁对如何实现这一点有其他的想法吗,类似于 SingleSignOn。
答案1
您可以尝试使用auth_basic 模块在http上下文级别将其应用于每个虚拟主机:
http {
auth_basic "Administrator’s Area";
auth_basic_user_file conf/htpasswd;
server { ... }
server { ... }
server { ... }
}