Nginx接口鉴权

    很多情况下接口都需要带签名校验,防止爬虫采集,对于写爬虫我也算老司机了,有时候也被爬很烦,只能用签名保护资源接口。

    通常是使用nginx反代程序端口的,一般在nginx做也比较合理,nginx对接口校验签名的方式有很多。

1.利用Nginx本身的模块进行简单的判断:referer、cookie 等
2.Nginx + 第三方语言控制:lua、javascript、java 等

    Nginx自身的语法局限性,所以用 lua 这类脚本语言进行更细致化的逻辑控制。

CDN的绝大数功能都是使用这类进行扩展,如:访问统计、请求钩子等

1、开始

nginx.conf
location ~* \.(mp4)
{
    set $flag 0;
    set_by_lua_file $flag "/lua/check.lua";
    if ( $flag = 1 ) {
         return 403;
    }
    // 其他业务逻辑
    // .......
}

2、Lua校验参数和签名

function empty(s)
    if s == nil then return true
    elseif s == "" then return true
    else return false end
end
-- 获取Get参数
local args = ngx.req.get_uri_args()
local sign = args["sign"]
local time = args["time"]

-- 基本的参数判断
if empty(sign) then
    return 1
end
if empty(time) then
    return 1
end

-- 校验签名参数
if sign ~= ngx.md5("AA"..time.."ZZ") then
    return 1
end

return 0

    这样一个防盗链就完成了,具体检测校验的逻辑是各不相同,可以使用各类模块来完成。

以上使用的环境是宝塔安装后的默认环境。

补充

lua_ssl_verify_depth 2;
lua_ssl_trusted_certificate /etc/ssl/certs/ca-bundle.trust.crt;
lua_package_path "/lua-resty-string/lib/?.lua;/lua-resty-http/lib/?.lua;;";
server {
    #省略.....

}

lua-resty-http 使用期一定要配置本地根证书,在 /etc/ssl/certs/ 目录下,否则使用发起Https请求会报错。