利用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
    }
}

说明和总结

  1. 此方式能轻松实现静态文件进行灵活的鉴权,甚至是无权限服务添加访问权限。

    • Nginx支持的鉴权配置,有4种:
  2. 使用鉴权URL时,基本目前基于请求头和URL参数的鉴权方式都支持,非常灵活。

    • proxy_pass_request_headers默认为on,会把原始请求Header转发到鉴权URL
    • 生成鉴权URL时,会把原始URL参数传过去。
  3. 鉴权URL的处理,最好跟原始URL无关,并把原始URL作为鉴权参数传过去。本示例代码做了URL字符串替换,对后面扩展不够灵活。
  4. 不建议使用Nginx实现复杂的功能。其配置文件不是代码,不是按顺序执行,也不方便调试。

标签: Nginx

添加新评论