我尝试像这个文档那样配置授权子请求
客户端发送具有授权的请求通过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;
...
}
好的,在我自己测试之后,我可以陈述一些事实。
Authorization
标头(以及其他主要请求标头)gets添加到子请求中。但是,它可以为子请求显式地重新定义:location /auth { proxy_set_header Authorization "sub"; proxy_pass ... }
或从子请求中完全删除:
location /auth { proxy_set_header Authorization ""; proxy_pass ... }
中间变量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-main
HTTP报头。
问题与CORS请求有关。OPTIONS请求没有包含授权头。验证服务返回错误。
解决方案:
location /backend {
auth_request /auth;
proxy_pass http://backend;
}
location /auth {
if ($request_method = 'OPTIONS') {
return 200;
}
proxy_pass http://auth;
}