当前位置: 首页 > news >正文

apisix的hmac-auth认证

目录

1、apisix的hmac认证Authorization头信息

2、signature的lua生成源码

3、java生成签证的简单示例

4、postman调用如下


apisix的hmac-auth认证,介绍可以看官方文档

hmac-auth | Apache APISIX® -- Cloud-Native API Gateway

照着官方文档,发现生成的签证根本调不通,所以研究了一下hmac-auth的生成源码,下面记录一下apisix的hmac需要怎么传参

1、apisix的hmac认证Authorization头信息

1.1hmac认证Authorization内容:


Signature signature="{具体签名}", keyId="{hmac的key}", algorithm="{hmac的算法}", headers="{需要生成签证的请求头}"


生成结果如下:
Signature signature="PpSL9rq26QtITXh33NhUpBJkNiskkkEDKKzFYqKKIC4=", keyId="a0f4cafbe86a43d5bcfdb7e97f32215b", algorithm="hmac-sha256", headers="date"

1.2参数介绍

algorithm:hmac支持的算法。具体可以看源码或者文档,只有几种,下面都是用的默认的算法HmacSHA256

headers:是说生成签名需要用的头信息,header里面的顺序也影响签名,具体签名生成见下文。下面介绍几个可能常用的header头。下面只是常用参数,还有一些别的head参数。验证了一下,不支持request-body这种不规范的

headers="date  @request-target"

date: GMT格式日期。  一般是搭配签证过期窗口使用的

@request-target:是一个特殊的字段,通常用于 HTTP 请求的签名生成。它表示请求的目标 URI(即请求的路径和查询参数),而不是请求头中的其他字段,可以理解成具有含义的常量,经常会用它判断逻辑

2、signature的lua生成源码

hmac-auth.lua文件,在验证的时候加了一下core.log.warn打印日志,获取一些中间结果

local function generate_signature(ctx, secret_key, params)
    local uri = ctx.var.request_uri
    local request_method = core.request.get_method()

    if uri == "" then
        uri = "/"
    end

    local signing_string_items = {
        params.keyId,
    }

    if params.headers then
        for _, h in ipairs(params.headers) do
            local canonical_header = core.request.header(ctx, h)
            if not canonical_header then
              if h == "@request-target" then
                local request_target = request_method .. " " .. uri
                core.table.insert(signing_string_items, request_target)
                core.log.warn("canonical_header name:", core.json.delay_encode(h))
                core.log.warn("canonical_header value: ",
                              core.json.delay_encode(request_target))
              end
            else
              core.table.insert(signing_string_items,
                                h .. ": " .. canonical_header)
              core.log.warn("canonical_header name1:", core.json.delay_encode(h))
              core.log.warn("canonical_header value1: ",
                            core.json.delay_encode(canonical_header))
            end
        end
    end

    local signing_string = core.table.concat(signing_string_items, "\n") .. "\n"
core.log.warn("======signing_string签证:", signing_string)
    return hmac_funcs[params.algorithm](secret_key, signing_string)
end

可以看出,如果请求头有@request-target,生成签证会用到uri和request_method,否则是不会用到的
(1)如果头没有@request-target,例如headers="request-line date request-body"
如果是get请求,那生成签证,就只需要keyId+"\n"+"date: "+具体GMT时间+"\n"
(2) 如果头有@request-target,例如headers="request-line date request-body @request-target"
如果是get请求,那生成签证,就要keyId+"\n"+"date: "+具体GMT时间+"\n"+request_method+" "+uri

3、java生成签证的简单示例

@Slf4j
public class HmacUtils {/**** 获取签证信息* @return String  返回值,message的生成规则和顺序都不是固定的,是根据header变化的* @Author: shisha* @Date: 2024/12/25 10:22**/public static String getSignature(String key,String hmacSecret) throws Exception {String dateStr = getCurrentGmt();//key和时间 "a0f4cafbe86a43d5bcfdb7e97f32215b\ndate: Tue, 24 Dec 2024 12:27:55 GMT\n";//   headers="date"String message = key +"\n"+"date: "+dateStr+"\n";//如果headers="date @request-target"//TODO message的生成规则和顺序都不是固定的,是根据header变化的message+="GET /dapi/v1.0/ssApi/getDataForGet?query=%7B%22pageIndex%22%3A1%2C%22pageSize%22%3A10%2C" +"%22apiTestToken%22%3A%2202024121716460709700000101001349%22%2C%22dz%22%3A%22%2Fdcpyo" +"%2FPRODUCTScxfw_4090%22%2C%22list%22%3A%5B%7B%22bm%22%3A%22PRODUCT_NAME%22%2C%22jtz%22%3A" +"%22RTX5060%22%7D%5D%2C%22apiId%22%3A%2202024112711241051600000101660374%22%7D&t=1734425245421\n" ;//获取签证return generateHmacSha256Base64(hmacSecret, message);}/**** Hmac生成签证的base64工具* @param message* @return String  返回值* @Author: shisha* @Date: 2024/12/25 9:49**/public static String generateHmacSha256Base64(String hmacSecret, String message) throws Exception {// 创建 HMAC-SHA256 实例Mac sha256_HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(hmacSecret.getBytes("UTF-8"), "HmacSHA256");sha256_HMAC.init(secret_key);// 计算 HMAC 值byte[] hmacBytes = sha256_HMAC.doFinal(message.getBytes("UTF-8"));// 进行 Base64 编码return Base64.getEncoder().encodeToString(hmacBytes);}public static String getCurrentGmt() {Date date = new Date();// Wed, 25 Dec 2024 01:50:59 GMTString form = "E, dd MMM yyyy HH:mm:ss";Locale locale = Locale.ENGLISH;SimpleDateFormat sdf = new SimpleDateFormat(form, locale);sdf.setTimeZone(TimeZone.getTimeZone("GMT"));String gmtTime = sdf.format(date) + " GMT";// 输出GMT时间字符串log.info(gmtTime);return gmtTime;}public static void main(String[] args) throws Exception {String key = "2e06116d05d6399c90c8a441942fb113";String hmacSecret = "005B192C781AEB9F641BC71DC6C63A43245E7ABBD";String signature = getSignature(key,hmacSecret);log.info(signature);//调用postman的请求参数示例,Authorization格式如下:// Signature signature="PpSL9rq26QtITXh33NhUpBJkNiskkkEDKKzFYqKKIC4=", keyId="a0f4cafbe86a43d5bcfdb7e97f32215b", algorithm="hmac-sha256", headers="request-line date request-body"}

4、postman调用如下

相关文章:

apisix的hmac-auth认证

目录 1、apisix的hmac认证Authorization头信息 2、signature的lua生成源码 3、java生成签证的简单示例 4、postman调用如下 apisix的hmac-auth认证,介绍可以看官方文档 hmac-auth | Apache APISIX -- Cloud-Native API Gateway 照着官方文档,发现生…...

elementPlus消息组件多按钮案例

let customClass zsl-el-message-box efb.messageBox({title: 操作提示,showConfirmButton: false,customClass,message: efb.VNode(div, null, [efb.VNode(style, null, .${customClass} .el-message-box__message {width: 100%;}),efb.VNode(div, null, hello world),efb.VN…...

计算机视觉目标检测-2

文章目录 摘要abstract1.Fast R-CNN1.1 RoI pooling1.2 End-to -End model1.3 多任务损失-Multi-task loss1.4 R-CNN、SPPNet、Fast R-CNN效果比对 2.Faster R-CNN2.1 RPN原理2.2 效果对比2.3 Faster R-CNN总结 3.总结4.参考文献 摘要 本周学习了Fast R-CNN和Faster R-CNN算法…...

爬虫数据存储:Redis、MySQL 与 MongoDB 的对比与实践

爬虫的核心任务是从网络中提取数据,而存储这些数据是流程中不可或缺的一环。根据业务需求的不同,存储的选择可能直接影响数据处理的效率和开发体验。本文将介绍三种常用的存储工具——Redis、MySQL 和 MongoDB,分析它们的特点,并提…...

深入解析MySQL索引结构:从数组到B+树的演变与优化

前言: 在数据库查询中,索引是一种关键的性能优化工具。然而,索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效,深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂&#xff0…...

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法&#xff…...

jmeter并发用户逐步递增压测找性能拐点

jmeter并发用户逐步递增压测找性能拐点 目的: 使用逐层递增的并发压力进行测试,找到单功能的性能拐点(一般需要包含四组测试结果,拐点前一组,拐点一组,拐点后两组),统计响应时间、…...

【PostgreSQL使用】最新功能逻辑复制槽的failover,大数据下高可用再添利器

逻辑复制的failover ​专栏内容: postgresql入门到进阶手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ✅ &#x1f52…...

【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)

本文项目编号 T 102 ,文末自助获取源码 \color{red}{T102,文末自助获取源码} T102,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Linux下Nvidia显卡GPU开启驱动持久化

GPU开启驱动持久化的原因 GPU 驱动一直处于加载状态, 减少运行程序时驱动加载的延迟。不开启该模式时,在程序每次调用完 GPU 后, GPU 驱动都会被卸载,下次调用时再重新加载, 驱动频繁卸载加载, GPU 频繁被…...

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&am…...

【玩转MacBook】Git安装

Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git,所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令: /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…...

【优先算法】双指针 --(结合例题讲解解题思路)(C++)

今日鸡汤: “无人负我青云志,我自踏雪至山巅。” -徐霞客《青云志》 释义:没有人能够帮助我实现我的理想,即使面对再大的困难,我也要踏着积雪,一步步,到达山巅。 目录 1.快乐数 2.盛最多的…...

简述css中z-index的作用?如何用定位使用?

z-index是一个css属性,用于控制元素的堆叠顺序, 如何使用定位用index 1、position:relative; z-index; 相对于自己来定位的,可以根据top,bottom,right,left&#xff…...

Redis——数据淘汰策略

文章目录 1. 引入2. 讲解2.1 Redis 中的 8 种数据淘汰策略2.2 LRU 和 LFU 算法2.3 建议 3. 总结 1. 引入 在 Redis——数据过期策略 的“引入”部分讲解过,Redis 的数据存在内存中,而内存容量相对较小,不能将大量数据 无限期 地缓存。然而&a…...

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点:缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…...

前端node.js

一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的对象,用于表示固定长度的字节序列。 Buffer…...

Excel基础知识

一:数组 一行或者一列数据称为一维数组,多行多列称为二维数组,数组支持算术运算(如加减乘除等)。 行:{1,2,3,4} 数组中的每个值用逗号分隔列:{1;2;3;4} 数组中的每个值用分号分隔行列&#xf…...

Spring Boot对访问密钥加密解密——RSA

场景 用户无需登录,仅仅根据给定的访问keyId和keySecret就可以访问接口。 keyId 等可以明文发送(不涉及机密),后端直接从请求头读取。keySecret 不可明文,需要加密后放在另一个请求头(或请求体&#xff0…...

Vue介绍

一、Vue框架简介 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它的核心库只关注视图层,易于上手,并且可以与其他库或现有项目进行整合。其特点包括响应式数据绑定、组件化开发和虚拟DOM等。 响应式数据绑定 Vue通过Object.defineProperty()方法来进行数据劫持。当…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键&#xff…...