nginx代理层做签名验证的实现示例

 更新时间:2026年08月02日 11:48:20   作者:oliver.chau  
本文详细介绍了在Nginx代理层实现签名验证,并通过Node.js执行签名校验逻辑,该方案适用于需要对API请求进行签名校验的场景,感兴趣的可以了解一下

要在nginx代理层做签名验证并由Node.js 执行 JS 脚本(例如签名校验逻辑),你可以按如下步骤实现:

🌐 一、架构说明

  • 客户端请求 → Nginx → Node.js 校验签名脚本 → 放行或拒绝请求
  • nginx通过**auth_request**模块将请求交给Node.js验证签名,结果决定是否转发到后端。

🔐 二、签名验证整体流程

步骤 1:客户端请求带签名参数

GET /api/data?timestamp=1715500000&sign=abc123 HTTP/1.1
Host: yourdomain.com

步骤 2:nginx 配置 auth_request(子请求去验证签名)

server {
    listen 80;
    server_name yourdomain.com;

    location /api/ {
        auth_request /auth;  # 调用子请求去验证签名
        auth_request_set $auth_status $upstream_status;

        proxy_pass http://backend_server;
    }

    location = /auth {
        internal;
        proxy_pass http://127.0.0.1:3000/verify-signature;  # Node.js 校验签名接口
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
}

步骤 3:Node.js 实现/verify-signature接口

假设你已有 JS 脚本 encrpt.js,可以通过 vm 模块动态执行。

verify-signature.js示例

const http = require('http');
const url = require('url');
const fs = require('fs');
const vm = require('vm');
// 加载签名脚本
const signScript = fs.readFileSync('./encrpt.js', 'utf8');
const sandbox = {};
vm.createContext(sandbox);
vm.runInContext(signScript, sandbox);
function verifySignature(query) {
    const { sign, ...params } = query;
    // 假设签名算法为 sandbox.getSign(params)
    const expectedSign = sandbox.getSign(params);
    return expectedSign === sign;
}
const server = http.createServer((req, res) => {
    if (req.url.startsWith('/verify-signature')) {
        const parsedUrl = url.parse(req.url, true);
        const isValid = verifySignature(parsedUrl.query);
        if (isValid) {
            res.writeHead(200);
            res.end('OK');
        } else {
            res.writeHead(401);
            res.end('Unauthorized');
        }
    } else {
        res.writeHead(404);
        res.end('Not Found');
    }
});
server.listen(3000, () => {
    console.log('Signature verifier running on http://localhost:3000');
});

步骤 4:测试

  • 正确签名时,nginx 子请求返回 200,主请求放行;
  • 错误签名时,nginx 子请求返回 401,主请求被拒绝。

✅ 补充建议

  • 使用 crypto 代替纯 JS 算法更安全(如 HMAC SHA256)
  • 签名参数中加入 timestamp 和 nonce 防重放攻击
  • auth_request 子请求应避免携带过多 headers

🔐 三、Nginx + Node.js 签名验证项目结构示例

以下是一个完整的 Nginx + Node.js 签名验证项目结构示例,适用于在 Nginx 层对 API 请求进行签名校验,Node.js 提供校验逻辑的方案。

📁 项目结构

sign-proxy-project/
├── nginx/
│   └── nginx.conf                  # Nginx 配置文件
├── node-sign-server/
│   ├── encrpt.js                   # JS 签名算法逻辑
│   ├── verify-signature.js         # Node.js HTTP 校验服务
│   └── package.json                # Node.js 依赖配置
└── README.md

📘 说明

✅encrpt.js— 签名逻辑(例:HMAC)

const crypto = require('crypto');
function getSign(params, secret = 'your-secret-key') {
    const sortedKeys = Object.keys(params).sort();
    const str = sortedKeys.map(k => `${k}=${params[k]}`).join('&');
    return crypto.createHmac('sha256', secret).update(str).digest('hex');
}
// 暴露函数给 vm 使用
this.getSign = getSign;

✅verify-signature.js— Node.js 签名校验服务

const http = require('http');
const url = require('url');
const fs = require('fs');
const vm = require('vm');
// 加载加密脚本
const code = fs.readFileSync(__dirname + '/encrpt.js', 'utf8');
const sandbox = {};
vm.createContext(sandbox);
vm.runInContext(code, sandbox);
// 签名校验函数
function verify(query) {
    const { sign, ...params } = query;
    const expected = sandbox.getSign(params);
    return expected === sign;
}
// 启动服务
http.createServer((req, res) => {
    if (req.url.startsWith('/verify-signature')) {
        const parsed = url.parse(req.url, true);
        if (verify(parsed.query)) {
            res.writeHead(200);
            res.end('OK');
        } else {
            res.writeHead(401);
            res.end('Invalid Signature');
        }
    } else {
        res.writeHead(404);
        res.end('Not Found');
    }
}).listen(3000, () => {
    console.log('Signature server running at http://localhost:3000');
});

✅nginx.conf— Nginx 配置示例

events {}

http {
    upstream backend_server {
        server 127.0.0.1:8000;
    }

    server {
        listen 8080;

        location /api/ {
            auth_request /auth;
            proxy_pass http://backend_server;
        }

        location = /auth {
            internal;
            proxy_pass http://127.0.0.1:3000/verify-signature;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
        }
    }
}

✅package.json(Node.js 项目)

{
  "name": "node-sign-server",
  "version": "1.0.0",
  "main": "verify-signature.js",
  "dependencies": {}
}

用 npm init -y 初始化即可。

▶️ 启动方式

  1. 启动 Node 服务:

    cd node-sign-server
    node verify-signature.js
    
  2. 启动 Nginx(使用本地 nginx 并加载配置):

    nginx -c /full/path/to/nginx.conf
    
  3. 发请求测试:

    curl "http://localhost:8080/api/data?timestamp=1715500000&foo=bar&sign=xxx"
    

到此这篇关于nginx代理层做签名验证的实现示例的文章就介绍到这了,更多相关nginx代理层做签名验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 文件上传到服务器文件名中文乱码问题

    文件上传到服务器文件名中文乱码问题

    上传附件到部署服务器,但是上传到服务器出现文件名中文乱码,中文变成(?)问号,而且在本地测试是正常的,通过打印日志发现,下面fileName乱码,本文给大家讲解文件上传到服务器文件名中文乱码问题解决方案,感兴趣的朋友一起看看吧
    2024-02-02
  • nginx rtmp模块编译 arm版本的问题

    nginx rtmp模块编译 arm版本的问题

    这篇文章主要介绍了nginx rtmp模块编译 arm版本的问题,pcre库和libz库都不用单独编译,在编译nginx时添加模块时一起编译,需要的朋友可以参考下
    2021-12-12
  • Nginx中CC攻击与DDoS防御的高级策略指南

    Nginx中CC攻击与DDoS防御的高级策略指南

    这篇文章主要为大家详细介绍了Nginx中CC攻击与DDoS防御的高级策略,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Nginx服务器下使用rewrite重写url以实现伪静态的示例

    Nginx服务器下使用rewrite重写url以实现伪静态的示例

    这篇文章主要介绍了Nginx服务器下使用rewrite重写url以实现伪静态的示例,这里举了Discuz!和WordPress这两个常用的PHP程序,需要的朋友可以参考下
    2015-12-12
  • Nginx 重写与重定向配置方法

    Nginx 重写与重定向配置方法

    Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重定向,rewrite可动态调整URI,常用于URL美化、反向代理等场景,本文介绍Nginx 重写与重定向配置方法,感兴趣的朋友一起看看吧
    2025-06-06
  • Nginx启动、重启、关闭/Nginx开启启动配置实现方式

    Nginx启动、重启、关闭/Nginx开启启动配置实现方式

    这篇文章介绍了如何手动启动、重启、关闭Nginx服务,以及如何通过配置文件和系统服务来管理Nginx,同时,还介绍了如何检查Nginx是否开机自启动,并提供了查看Nginx状态、启动、停止和重启服务的命令
    2026-03-03
  • 利用nginx同一端口部署多个前端的办法(亲测有效版)

    利用nginx同一端口部署多个前端的办法(亲测有效版)

    在Nginx中配置同一个端口支持多个前端应用,通常可以通过不同的路径(location)来映射不同的前端项目,这篇文章主要介绍了利用nginx同一端口部署多个前端的相关资料,需要的朋友可以参考下
    2026-01-01
  • 利用nginx与ffmpeg搭建流媒体服务器过程详解

    利用nginx与ffmpeg搭建流媒体服务器过程详解

    这篇文章主要给大家介绍了利用nginx与ffmpeg搭建流媒体服务器的全过程,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • nginx解决图片显示过慢,下载不完全的问题

    nginx解决图片显示过慢,下载不完全的问题

    这篇文章主要介绍了nginx解决图片显示过慢,下载不完全的问题,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 通过Nginx反向代理实现IP访问分流的示例代码

    通过Nginx反向代理实现IP访问分流的示例代码

    本篇文章主要介绍了通过Nginx反向代理实现IP访问分流的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论