我有一个场景,服务器需要在实际请求之前执行授权请求。因此,一项请求由两种不同的服务提供。
Nginx的位置必须由Auth-Service处理,如果响应状态为200 OK,则应将请求转发给Feature-Service。否则,如果响应状态401,则应将此状态回复到前端。
upstream auth_service {
server localhost:8180;
}
upstream feature_service {
server localhost:8080;
}
location /authAndDo {
# suggest here
}
nginscript中的代码片段也可以。
答案 0 :(得分:3)
专门为此目的,http://nginx.org/r/auth_request存在http://nginx.org/docs/http/ngx_http_auth_request_module.html(默认情况下不构建)。
它允许您通过子请求将身份验证放入您想要的任何位置,从而有效地将身份验证与实际资源分开。
答案 1 :(得分:2)
一般情况下,Web服务器无法做到这一点。 401是前端的响应加上HTTP WWW-Authenticate响应头。根据需要开发Web应用程序或编辑401文件。 HTTP 401 has RFC specification。用户,浏览器应该了解消息。 Nginx doc described how 401 will be handled。
Nginx社区版auth_request
仅在子请求返回HTTP 200时处理,否则401默认情况下不会重定向超过401,其他标头将不处理响应以保护应用程序&用户。 Nginx社区版甚至不支持HTTP / 2的所有功能。它会变得更糟。
Apache2 Web服务器具有完整的HTTP / 2支持和custom 401 location in auth module,仅适用于少数浏览器。很少有浏览器允许Apache2完美地完成这项工作。其他人显示无法加载页面。在Stack Exchange网络的各个子域名之前人们要求Apache2使其适用于所有浏览器。
你几乎无法重定向Nginx:
error_page 401 /401.html;
location ~ (401.html)$ {
alias /usr/share/nginx/html/$1;
}
另一种方法可能是使用反向代理与另一台服务器like peoples talking here on Github。我无法保证加载页面失败。