Configure Nginx Authentication Based on Subrequest Result
利用Nginx部署了图片服务,为了实现请求图片时进行鉴权,使用了auth_request
的配置。
参考官网文档:Authentication Based on Subrequest Result | NGINX Documentation
整理后的示例代码,如下:
server {
...... # 略过一些配置
underscores_in_headers on; # 可选。允许请求header名称带下划线(_)
location ^~ /images/ {
# 配置鉴权规则
auth_request /auth;
# 生成鉴权URL,并添加请求参数。
set $auth_request_uri $uri; # 创建变量,传递鉴权URL
if ($uri ~ ^/images/(.*)$) {
# 利用if实现对URL进行字符串替换,生成想要的鉴权URL,并带上请求参数
# 由于静态文件,尤其是图片,一般使用GET方法,所以URL的请求参数可以作为鉴权参数
set $auth_request_uri /auth/$1?$args;
}
# 将401、403状态码映射为404。即鉴权失败时,让浏览器以为文件不存在。
# 由于“/404.html”不存在,Nginx会返回默认的404错误页面。
error_page 401 403 =404 /404.html;
# 设置图片存放目录,/images/有/结尾,这里也要有/结尾
alias /opt/sites/pub_img/;
}
# 这里配置鉴权后端的请求,即鉴权URL
location = /auth {
internal; # 只能内部访问
proxy_pass http://127.0.0.1:8080$auth_request_uri; # 设置完整的鉴权URL
proxy_pass_request_headers on; # 默认值。转发所有原始的请求header到鉴权URL
proxy_pass_request_body off; # 不向鉴权URL接发送原始的请求体
proxy_set_header Content-Length ""; # 不向鉴权URL发送原始的请求体
proxy_set_header X-Original-URI $request_uri; # 传递原始的请求URL
}
}
说明和总结
此方式能轻松实现静态文件进行灵活的鉴权,甚至是无权限服务添加访问权限。
- Nginx支持的鉴权配置,有4种:
- IP限制:Module ngx_http_access_module
- 用户名+密码:Module ngx_http_auth_basic_module
- 鉴权URL(本文介绍):Module ngx_http_auth_request_module
- JWT鉴权(需要商业订阅):Module ngx_http_auth_jwt_module
使用鉴权URL时,基本目前基于请求头和URL参数的鉴权方式都支持,非常灵活。
proxy_pass_request_headers
默认为on
,会把原始请求Header转发到鉴权URL- 生成鉴权URL时,会把原始URL参数传过去。
- 鉴权URL的处理,最好跟原始URL无关,并把原始URL作为鉴权参数传过去。本示例代码做了URL字符串替换,对后面扩展不够灵活。
- 不建议使用Nginx实现复杂的功能。其配置文件不是代码,不是按顺序执行,也不方便调试。