nginx子请求中的授权头丢失



我尝试像这个文档那样配置授权子请求

客户端发送具有授权的请求通过nginx头文件到受保护的资源。但是当nginx发送子请求来检查访问权限时,授权子请求的头文件缺失。

i tried use this parameters in auth location:

proxy_set_header authorization $http_authorization;

但是没有得到结果。

特殊的nginx变量如$http_<name>不与子请求共享(update):这是一个错误的假设,请求头实际上得到与子请求共享(请参阅对答案的更新)。内部nginx子请求API是非常特殊的事情,许多使用它的模块甚至不会在主请求和子请求之间共享变量容器。然而,auth_request_module是某种例外,使得使用中间变量的解决方案成为可能:

location /auth {
proxy_set_header Authorization $main_auth;
proxy_pass ...
}
location / {
set $main_auth $http_authorization;
auth_request /auth;
...
}

好的,在我自己测试之后,我可以陈述一些事实。

  1. Authorization标头(以及其他主要请求标头)gets添加到子请求中。但是,它可以为子请求显式地重新定义:

    location /auth {
    proxy_set_header Authorization "sub";
    proxy_pass ...
    }
    

    或从子请求中完全删除:

    location /auth {
    proxy_set_header Authorization "";
    proxy_pass ...
    }
    
  2. 中间变量do将数据从主请求传递到auth_request_module发出的子请求:

    location /auth {
    proxy_set_header X-From $from;
    proxy_pass ...
    }
    location / {
    set $from "from-main";
    auth_request /auth;
    ...
    }
    

    验证后端接收X-From: from-mainHTTP报头。

问题与CORS请求有关。OPTIONS请求没有包含授权头。验证服务返回错误。

解决方案:

location /backend {
auth_request                /auth;
proxy_pass                  http://backend;
}
location /auth {
if ($request_method = 'OPTIONS') {
return 200;
}
proxy_pass                  http://auth;
}

最新更新