OpenResty,Nginx实现接口验签与黑名单控制

news2025/2/26 2:27:33

介绍

nginx与openresty是两种优秀知名的7层负载均衡软件,nginx以其出色的性能和稳定性成为首选,而openresty则是在Nginx基础上构建的,支持嵌入Lua语言,大幅提升了开发效率。

安装OpenResty

  • 版本
    openresty-1.25.3.1-win64
  • 下载地址
    点击跳转下载地址

功能实现

验签直接返回响应体

  • 打开nginx.conf文件编写脚本(使用hmac对原文生成hash值再取base64编码)
server {
        listen       80;
        server_name  localhost;
		#对外接口验签
		location /api {
		    default_type "application/json";
		    content_by_lua_block {
		        -- table是否包含指定元素方法
		        function arr_include(tab, value)
                    for k,v in pars(tab) do
                      if v == value then
                          return true
                      end
                    end
                    return false
                end

		        local headers = ngx.req.get_headers();
				local token = headers["token"];
				-- 无token
				if (token == nil) then
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "token为空"));
                    return;
				end
				-- 黑名单
                local guestIp = headers["X-Real-IP"] or headers["X-Forwarded-For"] or ngx.var.remote_addr;
                ngx.say(string.format("请求ip:%s", guestIp));
                local blacks = {"127.0.0.1", "10.190.75.139"};
                if (arr_include(blacks, guestIp)) then
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "黑名单禁止访问"));
                    return;
                end
				-- 验签-读取请求体
				ngx.req.read_body();
				local reqBody = ngx.req.get_body_data();
				ngx.say(string.format("请求体:%s", reqBody));
			    -- 开始验签
                local key = "A7409BB67B472E6CC7EF17C49784A6B8";
                local digest = ngx.encode_base64(ngx.hmac_sha1(key, reqBody));
                ngx.say(string.format("nginx签名值:%s", digest));
                if (digest == token) then
                    ngx.say(string.format("{\"success\":true,\"msg\":\"%s\"}", "校验通过"));
                else
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "验签失败"));
                end
			}
		}
    }
  • 启动nginx.exe

  • 客户端hmac哈希签名
    通过sha1哈希算法与密钥生成签名值
    在这里插入图片描述

  • 注释黑名单代码并且nginx -s reload后,调用接口测
    在这里插入图片描述
    在这里插入图片描述

  • 启用黑名单代码后,调用接口测试
    在这里插入图片描述
    黑名单功能也可以将黑名单放入redis,通过OpenResty编写lua脚本从redis获取黑名单ip来实现

验签通过后转发到上游服务

  • 介绍
    在上面的例子实现了验签后直接返回结果,但真实应用的时候一般是验签通过后转发到上游的业务应用,这时候我们的脚本得稍微进行改造,使用access_by_lua_block。
  • 代码实现
server {
        listen       80;
        server_name  localhost;
        location / {
		    default_type "text/html";
            content_by_lua 'ngx.say("<html><p>nginx start by lua<p><html>")';
        }
		#对外接口验签
		location /api {
		    default_type "application/json";
		    access_by_lua_block {
		        -- table是否包含指定元素方法
		        local function arr_include(tab, value)
                    for k,v in pairs(tab) do
                      if v == value then
                          return true
                      end
                    end
                    return false
                end

		        local headers = ngx.req.get_headers();
				local token = headers["token"];
				-- 无token
				if (token == nil) then
				    ngx.status = 403;
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "token为空"));
                    return ngx.exit(403);
				end
				-- 黑名单
                local guestIp = headers["X-Real-IP"] or headers["X-Forwarded-For"] or ngx.var.remote_addr;
                local blacks = {"10.190.75.139"};
                if (arr_include(blacks, guestIp)) then
                    ngx.status = 403;
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "黑名单禁止访问"));
                    return ngx.exit(403);
                end
				-- 验签-读取请求体
				ngx.req.read_body();
				local reqBody = ngx.req.get_body_data();
			    -- 开始验签
                local key = "A7409BB67B472E6CC7EF17C49784A6B8";
                local digest = ngx.encode_base64(ngx.hmac_sha1(key, reqBody));
                if (digest ~= token) then
                    ngx.status = 403;
                    ngx.say(string.format("{\"success\":false,\"msg\":\"%s\"}", "验签失败"));
                    return ngx.exit(403);
                end
			}
			proxy_pass http://localhost/backend;
		}

		location /backend {
		    default_type "application/json";
		    content_by_lua_block {
		        ngx.say(string.format("{\"success\":true,\"msg\":\"%s\"}", "校验通过"));
                return ngx.exit(200);
		    }
		}
    }
  • nginx -s reload后测试
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode面试经典150题】36. 旋转图像(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

软件本地化:步骤、成本和障碍

瓦莱丽娅舍斯托博耶娃&#xff0c;Logrus IT翻译部门的经理&#xff0c;谈论了我们公司的运作方式、软件本地化是什么以及为什么它如此重要。 你能告诉我一些关于你们公司的情况吗&#xff0c;瓦莱丽娅&#xff1f;它做什么&#xff0c;成立多久了&#xff1f; Logrus IT今年…

袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

4月10日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕。大会中&#xff0c;袋鼠云带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

【pinia学习】pinia课程学习笔记

课程地址&#xff1a; VUE新一代状态管理工具Pinia超详细基础入门 贴两个链接&#xff1a; vue3官方文档 pinia官方文档 P1 《pinia的简介》 不得不说“开卷有益&#xff0c;学有所获”&#xff0c;前两天自己找pinia的官方文档好像也没找对&#xff0c;原来在vue3官方生态系…

万象皆歌everySings音乐与AI技术的邂逅,内测启动

在这个快节奏的数字时代&#xff0c;音乐依然扮演着连接人心、传递情感的重要角色。然而&#xff0c;音乐创作往往被视为门槛较高的艺术形式&#xff0c;需要复杂的理论知识和漫长的实践经验。但现在&#xff0c;随着人工智能技术的不断进步&#xff0c;让大众对音乐的获悉和交…

消息的可靠性·

面试题&#xff1a;Rabbitmq怎么保证消息的可靠性? 1.消费端消息可靠性保证&#xff1a; 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a; 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消…

JS加密:对比JScrambler和JShaman加密效果

本文&#xff0c;以一个实例&#xff0c;比对JS加密两大神器&#xff1a;JScrambler、JShaman的加密结果&#xff0c;看看谁的加密效果更好。 注&#xff1a;本文不是技术文章&#xff0c;仅仅从加密结果的“型”上简单观查&#xff0c;不做技术分析&#xff0c;仅看哪个加密代…

【学习笔记】3、逻辑门电路

3.1 MOS逻辑门电路 按照器件结构的不同形式&#xff0c;分为NMOS、PMOS、CMOS三种逻辑门电路。 3.1.1 CMOS CMOS电路成为主导地位的逻辑器件。工作速度&#xff1a;赶上甚至超过TTL电路。&#xff08;早期CMOS速度慢&#xff0c;后来工艺提升速度变快&#xff09;功耗和抗干…

【讲解下TypeScript的基础知识点】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

RK3568驱动指南|第二篇 字符设备基础-第15章 文件私有数据实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Logistic 回归为什么适用于二分类问题?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Logistic 回归非常适用于二分类问题的主要原因在于它的核心机制和输出特性。首先&#xff0c;Logistic 回归模型基于概率的理念&#xff0c;通过 Sigmoid 函数转换输入特征的线性组合&#xff0c;将任意…

windows下安装yolov8环境(详细图文教程)

目录 一&#xff1a;前言 二&#xff1a;安装yolov8 一&#xff1a;前言 最近看了 YOLO 的发展史&#xff0c;发现在机器视觉领域的应用非常广泛&#xff0c;f刚好最近一直在做机器视觉的工作&#xff0c;特此记录下搭建yolov的环境。我们使用的版本是yolov8的就用这个作为演…

【简单讲解下WebSocket】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

OpenHarmony NAPI 框架生成工具实现流程

NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时&#xff0c;底层框架开发者无需关注 Nodejs 语法、C 与 JS 之间的数据类型转换等上层应用转换逻辑&#xff0c;只关注底…

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次&#xff0c;已列入Github官方Trending榜第一位&#xff0c;PaperswithCode热度榜第一位&#xff0c;HuggingFace Spaces趋势榜第一位。项…

Linux之线程互斥与同步

1.线程互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源 。 临界区&#xff1a;每个线程内部&#xff0c;访问临界自娱的代码&#xff0c;就叫做临界区。 互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&#xff0c;访问临…

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED cubemx基础配置LED 引脚配置按键配置按键引脚配置定时器扫描配置 工程管理配置点亮LED程序设计keil配置与程序下载 参考博文1&#xff1a;STM32 | 利用STM32CubeMX初始化一个STM32工程 参考博文1&#xff1a;点亮LED灯&#x…