使用 nginx 拦截浏览器的基本授权弹出窗口

使用 nginx 拦截浏览器的基本授权弹出窗口

我正在尝试使用 nginx 拦截基本弹出窗口并卡在用户密码处。

我有一个登陆页面,用户可以在其中输入用户名/密码,然后表单会发布到http://localhost/validate

以下是我得到的块,如果我对 base64 编码的用户名:密码进行硬编码,一切正常,但以编程方式执行则不起作用。

location /validate/
{
set_form_input $username;
set_form_input $password;
set $auth_raw "$username:$password";
set_encode_base64 $digest $auth_raw; # $digest = some_hash_value

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization "Basic <<<some_hash_value>>>"; # This works
#proxy_set_header Authorization "Basic $digest"; # This does not work
proxy_pass http://localhost:5601/;

}

如上所示,

对哈希值进行硬编码可以让我绕过基本身份验证弹出窗口:

proxy_set_header Authorization "Basic <<<some_hash_value>>>"; 

但使用变量分配它不起作用:

proxy_set_header Authorization "Basic $digest";

仅从外观上看,我无法动态分配 proxy_set_header 授权所需的值。

简而言之,我希望能够做到以下几点,

  1. 用户在页面上输入用户名和密码并点击提交。
  2. 数据发布到http://localhost/validate
  3. Nginx 在 /validate 上看到请求并开始处理表单值并编写 URL(base64 编码等效)http://username:password@localhost:5601
  4. 端口 5601 上的服务器看到用户名/密码并对用户进行身份验证并让用户进入。

我在这里做错了什么? 或者有没有更好的方法用 nginx 来处理这个问题?

答案1

表单提交 URL(操作属性)缺少尾部斜杠。

表单提交后,会向 发出 POST 请求/validate,这会导致 nginx 响应重定向到/validate/。浏览器通过发出不包含原始数据的 GET 请求来遵循重定向。实际上,nginx 规则会收到空凭据。

<form>解决方案是在元素的属性中添加尾部斜杠,action使其看起来像:action="http://localhost/validate/"

相关内容