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) doif v == value thenreturn trueendendreturn falseendlocal headers = ngx.req.get_headers();local token = headers["token"];-- 无tokenif (token == nil) thenngx.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)) thenngx.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) thenngx.say(string.format("{\"success\":true,\"msg\":\"%s\"}", "校验通过"));elsengx.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) doif v == value thenreturn trueendendreturn falseendlocal headers = ngx.req.get_headers();local token = headers["token"];-- 无tokenif (token == nil) thenngx.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)) thenngx.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) thenngx.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.rhkb.cn/news/310138.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习和深度学习--李宏毅(笔记与个人理解)Day11-12

Day11 when gradient is small…… 怎么知道是局部小 还是鞍点&#xff1f; using Math 这里巧妙的说明了hessan矩阵可以决定一个二次函数的凹凸性 也就是 θ \theta θ 是min 还是max&#xff0c;最后那个有些有些 哈 是一个saddle&#xff1b; 然后这里只要看hessan矩阵是不…

STM32学习和实践笔记(5):时钟树

STM32一共有4个时钟源。外部时钟高低速各一个&#xff0c;内部时钟高低速各一个。 外部高速时钟是&#xff1a;4-16MHZ的HSE OSC。HS表示高速high speed. E表示外部的external。开发板该处安装的8M晶振。 外部低速时钟是&#xff1a;32.768KHz的LSI OSC。LS表示高速low speed…

Go——面向对象

一. 匿名字段 go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范&#xff0c;但是定义规范不实现&#xff…

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…

用c++实现串匹配问题、选择排序

5.2.2 串匹配问题 【问题】 给定两个字符串S和T&#xff0c;在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配&#xff09;&#xff0c;T称为模式。在文本处理系统、操作系统、编译系统、数据库系统以及 Internet 信息检索系统中&#xff0c;串匹配是使用最频…

分布式系统:缓存与数据库一致性问题

前言 缓存设计是应用系统设计中重要的一环&#xff0c;是通过空间换取时间的一种策略&#xff0c;达到高性能访问数据的目的&#xff1b;但是缓存的数据并不是时刻存在内存中&#xff0c;当数据发生变化时&#xff0c;如何与数据库中的数据保持一致&#xff0c;以满足业务系统…

Linux shell编程学习笔记46:awk命令的由来、功能、格式、选项说明、版权、版本

0 前言 在编写Linux Shell脚本的过程中&#xff0c;我们经常要对Linux命令执行的结果进行分析和提取&#xff0c;Linux也在文本分析和提取这方面提供了不少的命令。比如我们之前研究过的cut命令。 Linux shell编程学习笔记43&#xff1a;cut命令https://blog.csdn.net/Purple…

史上最全excel导入功能测试用例设计(以项目为例)

web系统关于excel的导入导出功能是很常见的&#xff0c;通常为了提高用户的工作效率&#xff0c;在维护系统中的一些数据的时候&#xff0c;批量导入往往比一个一个添加或者修改快很多。针对导入功能的测试&#xff0c;往往会有很多种情况&#xff0c;现在针对平时项目中遇到的…

Excel·VBA二维数组S形排列

与之前的文章《ExcelVBA螺旋数组函数》将一维数组转为二维螺旋数组 本文将数组转为S形排列的二维数组&#xff0c;类似考场座位S形顺序 Function S形排列(ByVal arr, ByVal num_rows&, ByVal num_cols&, Optional ByVal mode$ "row")将数组arr转为num_rows…

Home Assistant OS转 Hassio Supervisor(docker 版本)

这是一个失败案例&#xff0c;请忽略。 原因 HAOS缺点&#xff1a;系统不是很好用&#xff0c;无法满足我在上面使用python开发插件的小需求&#xff08;或许有方法满足&#xff0c;但是我没找到&#xff09;。 HAOS优点&#xff1a;方便安装&#xff0c;配置非常方便。 数据…

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…

面试官:说一说CyclicBarrier的妙用!我:这个没用过...

写在开头 面试官&#xff1a;同学&#xff0c;AQS的原理知道吗&#xff1f; 我&#xff1a;学过一点&#xff0c;抽象队列同步器&#xff0c;Java中很多同步工具都是基于它的… 面试官&#xff1a;好的&#xff0c;那其中CyclicBarrier学过吗&#xff1f;讲一讲它的妙用吧 我&…

音乐文件逆向破解

背景 网易云等在线音乐文件的加密源码都按照一定的规则加密&#xff0c;通过对音乐文件的源码分析转化&#xff0c;有望实现对加密文件的解密 实现内容 实现对加密音乐文件的解密 实现对无版权的音乐文件的转化 实现环境 010editor 010 Editor是一个专业的文本编辑器和十六…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

破译验证码reCAPTCHA 之 打码平台

由于登录需要验证码&#xff0c;除了日常的字符串&#xff0b;数字&#xff0c;此时就需要用第三方插件进行破译。 reCaptcha是Google公司的验证码服务&#xff0c;方便快捷&#xff0c;改变了传统验证码需要输入n位失真字符的特点。 1. reCAPTCHA 初识 reCaptcha是Google公司…

1、IPEX-LLM(原名BigDL-LLM)环境配置

IPEX-LLM 是一个为Intel XPU (包括CPU和GPU) 打造的轻量级大语言模型加速库&#xff0c;在Intel平台上具有广泛的模型支持、最低的延迟和最小的内存占用。 您可以使用 IPEX-LLM 运行任何 PyTorch 模型&#xff08;例如 HuggingFace transformers 模型&#xff09;。在运行过程中…

结合创新!ResNet+Transformer,高性能低参数,准确率达99.12%

今天给各位介绍一个发表高质量论文的好方向&#xff1a;ResNet结合Transformer。 ResNet因其深层结构和残差连接&#xff0c;能够有效地从图像中提取出丰富的局部特征。同时&#xff0c;Transformer的自注意力机制能够捕捉图像中的长距离依赖关系&#xff0c;为模型提供全局上…

世界需要和平--中介者模式

1.1 世界需要和平 "你想呀&#xff0c;国与国之间的关系&#xff0c;就类似于不同的对象与对象之间的关系&#xff0c;这就要求对象之间需要知道其他所有对象&#xff0c;尽管将一个系统分割成许多对象通常可以增加其可复用性&#xff0c;但是对象间相互连接的激增又会降低…

MySQL中的存储过程详解(上篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…

【word】文档标题如何自动编号

我在写一个word文档的时候&#xff0c;每一级标题的格式都设置好了&#xff0c;包括字体&#xff0c;大小等等&#xff0c;但是如何自动编号呢&#xff1f; 在写中期报告的时候&#xff0c;我对每一级标题的格式都创建了一个单独的样式&#xff0c;像这样&#xff1a; 对于每一…