我正在尝试使用 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 授权所需的值。
简而言之,我希望能够做到以下几点,
- 用户在页面上输入用户名和密码并点击提交。
- 数据发布到http://localhost/validate
- Nginx 在 /validate 上看到请求并开始处理表单值并编写 URL(base64 编码等效)http://username:password@localhost:5601
- 端口 5601 上的服务器看到用户名/密码并对用户进行身份验证并让用户进入。
我在这里做错了什么? 或者有没有更好的方法用 nginx 来处理这个问题?
答案1
表单提交 URL(操作属性)缺少尾部斜杠。
表单提交后,会向 发出 POST 请求/validate
,这会导致 nginx 响应重定向到/validate/
。浏览器通过发出不包含原始数据的 GET 请求来遵循重定向。实际上,nginx 规则会收到空凭据。
<form>
解决方案是在元素的属性中添加尾部斜杠,action
使其看起来像:action="http://localhost/validate/"
。