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

介绍

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后测试
    在这里插入图片描述
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

D. Solve The Maze Codeforces Round 648 (Div. 2)

题目链接&#xff1a; Problem - 1365D - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/problemset/problem/1365/D 题目大意&#xff1a; 有一张地图n行m列&#xff08;地图外面全是墙&#xff09;&#xff0c…

阿里云服务器配置选择详细指导

云服务器配置如何选择&#xff1f;云服务器配置包括CPU内存、公网带宽和系统盘&#xff0c;阿里云服务器还要注意云服务器规格及轻量应用服务器的选择&#xff0c;云服务器吧以阿里云服务器为例来详细说下小白用户选择云服务器配置攻略&#xff1a; 一、准备工作 如果你不注册…

文献速递:深度学习肝脏肿瘤诊断---基于多相增强 CT 和临床数据的恶性肝肿瘤鉴别诊断深度学习

Title 题目 Deep learning for diferential diagnosisof malignant hepatic tumors based on multi-phase contrast-enhanced CT and clinical data 基于多相增强 CT 和临床数据的恶性肝肿瘤鉴别诊断深度学习 Abstract 摘要 Liver cancer remains the leading cause of can…

2024 年 AI代码助手AI Coding Assistant智能工具

AI代码助手&#xff08;AI Coding Assistant&#xff09;是一种利用人工智能帮助开发人员更快、更准确地编写代码的软件工具。 它可以通过根据提示生成代码或在你实时编写代码时建议自动完成代码来实现此目的。 以下是AI代码助手可以做的一些事情&#xff1a; 与你使用的流行代…

指令集体系简读

这一部分&#xff0c;采用问答的方式来进行梳理&#xff1b; 什么是指令集体系&#xff1f; 指令集体系(Instruction Set Architecture,ISA)是规定处理器的外在行为的一系列内容的统称&#xff0c;它包括&#xff1a; 基本数据类型(data types)、指令(instructions)、寄存器…

Socks5代理IP如何使用?详细教程解析

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

使用了代理IP怎么还会被封?代理IP到底有没有效果?

代理IP作为一种网络工具&#xff0c;被广泛应用于各种场景&#xff0c;例如网络爬虫、海外购物、规避地区限制等。然而&#xff0c;很多用户在使用代理IP的过程中却发现自己的账号被封禁&#xff0c;这让他们不禁产生疑问&#xff1a;使用了代理IP怎么还会被封&#xff1f;代理…

MXNet安装:专业指南与深度解析

一、引言 MXNet是一个高效且灵活的深度学习框架&#xff0c;它支持多种编程语言和平台&#xff0c;并提供了丰富的深度学习算法和工具。随着深度学习技术的广泛应用&#xff0c;MXNet因其出色的性能和易用性受到了越来越多开发者和研究人员的青睐。本文将详细介绍MXNet的安装过…

YOLOV5 分类:利用yolov5进行图像分类

1、前言 之前介绍了yolov5的目标检测示例,这次将介绍yolov5的分类展示 目标检测:YOLOv5 项目:训练代码和参数详细介绍(train)_yolov5训练代码的详解-CSDN博客 yolov5和其他网络的性能对比 yolov5分类的代码部分在这 2、数据集准备 yolov5分类的数据集就是常规的摆放方式…

SpringCloudAlibabaSeate处理分布式事务

SpringCloudAlibabaSeate处理分布式事务 1、部分面试题 微服务boot/cloud做的项目&#xff0c;你不可能只有一个数据库吧&#xff1f;那么多个数据库之间如何处理分布式事务的&#xff1f; 一个场景&#xff1a;在订单支付成功后&#xff0c;交易中心会调用订单中心的服务把订…

如何在公网环境远程管理内网Windows系统部署的MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

通讯录项目(用c语言实现)

一.什么是通讯录 通讯录是一种用于存储联系人信息的工具或应用程序。它是一种电子化的地址簿&#xff0c;用于记录和管理个人、机构或组织的联系方式&#xff0c;如姓名、电话号码、电子邮件地址和邮寄地址等。通讯录的目的是方便用户在需要时查找和联系他人。 通讯录通常以列…

DC-DC 5V2A异步升压5V2A输出电源升压芯片2.6-5.5V供电

一、芯片概述&#xff1a; FP6298是一个电流模式升压DC-DC转换器。它是内置PWM电路0.08Ω功率MOSFET&#xff0c;使该调节器高效。内部补偿网络还可以最小化多达6个外部组件计数。误差放大器的非反相输入连接到一个0.6V的精度参考电压&#xff0c;内部的软启动功能可以降低涌入…

【2024最新博客美化教程重置版】在网页中使用L2Dwidget二次元可动人物前端插件,让动漫美女伴随你左右!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 L2Dwidget 二次…

Java 中文官方教程 2022 版(三十四)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html 长期持久性 原文&#xff1a;docs.oracle.com/javase/tutorial/javabeans/advanced/longpersistence.html 长期持久性是一种模型&#xff0c;可以将 bean 保存为 XML 格式。 有关 XML 格式和如何为非 be…

SQL执行流程图文分析:从连接到执行的全貌

SQL执行总流程 下面就是 MySQL 执行一条 SQL 查询语句的流程&#xff0c;也从图中可以看到 MySQL 内部架构里的各个功能模块。 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在…

员工管理系统!(免费获取源码)

​今天给大家分享一套基于SpringbootVue的员工管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文末自取) 一、系统运行图 1、登陆页面 2、后台管理页面 3、职工管理 4、请假审批管理 二、系统搭建视频教程 源码免费领取方式 后台私信回复员工即可…

从大量数据到大数据,King’s SDMS仪器数据采集及科学数据管理系统的应用

对于实验室或检测机构&#xff0c;仪器设备是所有业务开展的基础&#xff0c;数据则是核心命脉&#xff0c;而传统的仪器设备原始数据收集方式&#xff0c;效率低耗时长、操作流程不规范、不易保存与查找、错误率高、易篡改等成了制约检测机构持续高速发展的瓶颈和弊端&#xf…

kvm虚拟机磁盘镜像加密

一、qcow2的aes加密 低版本的qemu能够支持对qcow2文件进行aes加密的方式&#xff0c;例如对一个已经存在的磁盘文件test.qcow2&#xff0c;可以将其转换为经过加密的qcow2文件。 qemu-img convert -O qcow2 --object secret,idsec0,data123456 -o encryptionon,encrypt.key-s…

springboot发送邮件

很久之前就想写一个总结的&#xff0c;一直没写&#xff0c;今天刚好又碰见了发送邮箱验证码的需求&#xff0c;刚好记录一波 一.核心依赖如下&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…