在宝塔面板中使用 lua 实现远程接口鉴权

  1. 使 lua 支持 resty.http

  2. 在网站配置文件中的 server 块内部添加:

        #鉴权-START
        resolver 223.5.5.5;  # 使用公共 DNS
        access_by_lua_block {
            local http = require("resty.http")
            local httpc = http.new()
            httpc:set_timeout(1000)  -- 连接超时
            local res, err = httpc:request_uri("https://鉴权地址/", {
                method = "GET",
                headers = {
                    ["X-Real-IP"] = ngx.var.remote_addr,
                    ["User-Agent"] = ngx.var.http_user_agent,
                    ["X-Forwarded-Host"] = ngx.var.host,
                    ["X-Forwarded-Uri"] = ngx.var.request_uri,
                },
                ssl_verify = false, -- 禁用 SSL 验证
                timeout = 1000,     -- 读取超时
            })
    
            if not res then
                ngx.log(ngx.ERR, "Failed to request: " .. err)
            end
            
            if res and res.status == 403 then
                ngx.exit(ngx.HTTP_FORBIDDEN)
                -- return ngx.redirect("https://一个显示403友好信息的页面.html")
            end
        }
        #鉴权-END

    注意更改接口地址和友情显示 403 页面地址。

    本示例仅捕获 403 状态码,500、408 等其它异常情况视为允许访问,请根据业务需求自行添加状态码的判断。

    若超时也会进入 if not res then 代码块。

  3. 若鉴权接口在私网中,将鉴权接口域名和私网 IP 添加到 hosts 文件中。


  1. 直接输出字符串

    ngx.header.content_type = "text/plain";
    ngx.say("hello world!")
  2. 输出到日志

    ngx.log(ngx.ERR, "Response status: " .. res.status)

    日志在网站的 站名.error.log 中查看。

    宝塔面板查看方式:日志 - 网站日志 - 异常

  3. 常见问题

    no resolver defined to resolve

    原因:没有定义 DNS 解析器

    解决方法:在 http 块或 server 块中添加 resolver 8.8.8.8 valid=30s;,当然使用接入商自己的公共 DNS 可能更合适。

    unable to get local issuer certificate

    原因:没有配置 SSL 证书信息

    解决方法:添加 request_uri 参数:

    ssl_verify = true,  -- 启用 SSL 验证
    ssl_trusted_certificate = "证书路径",  -- 指定 CA 证书路径

    ssl_verify = false,  -- 禁用 SSL 验证
  4. 若您不想用 lua,可以用 nginx 原生自带的  auth_request 模块来实现

xoyozo 2 天前
转载请注明出处
可能相关的内容