apisix~hmac-auth插件的使用

news/2025/3/31 0:23:08/文章来源:https://www.cnblogs.com/lori/p/18798116

hmac-auth插件需要和 Consumer 一起使用,API 的使用者必须将密匙添加到请求头中以验证其请求,下面介绍它的主要用法

参数

  • algorithm 算法 默认hmac-sha256 ["hmac-sha1", "hmac-sha256", "hmac-sha512"],客户端请求头X-HMAC-ALGORITHM=hmac-sha256
  • clock_skew 签名允许的时间偏移(以秒为单位)
  • access_key Consumer 的 access_key 必须是唯一的,客户端请求时在请求头添加X-HMAC-ACCESS-KEY=access_key值
  • signed_headers 要在加密计算中使用的 headers 列表,客户端请求头X-HMAC-SIGNED-HEADERS
  • X-HMAC-SIGNATURE 客户端请求头中的签名

消费者配置

  • 添加hmac-auth插件,配置access_key,类似于app_id
  • 这个消费者有两个能力,除了hmac-auth以外,还有key-auth的能力,即简单的认证方式

签名生成的过程

接下来,我们将以下述请求为例,为你介绍签名生成公式的具体计算过程:

curl -i http://127.0.0.1:9080/index.html?name=james&age=36 \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"
  1. 上文请求默认的 HTTP Method 是 GET,得到 signing_string 为:
"GET"
  1. 请求的 URI 是 /index.html,根据 HTTP Method + \n + HTTP URI 得到 signing_string 为:
"GET
/index.html"
  1. URL 中的 query 项是 name=james&age=36,假设 encode_uri_params 为 false,根据 canonical_query_string 的算法,重点是对 key 进行字典排序,得到 age=36&name=james;根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string 得到 signing_string 为:
"GET
/index.html
age=36&name=james"
  1. access_key 是 user-key,根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key 得到 signing_string 为:
"GET
/index.html
age=36&name=james
user-key"
  1. Date 是指 GMT 格式的日期,不能缺少,形如 Tue, 19 Jan 2021 11:33:20 GMT, 根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key + \n + Date 得到 signing_string 为:
"GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT"

因为人家apisix服务端lua插件源码,使用的是这种GMT格式,所以咱们使用者也需要跟人家保持一致,事实上,我更倾向于使用时间戳,没有日期格式和时区的问题

  1. signed_headers_string 用来制定参与到签名的 headers,在上面示例中包括 User-Agent: curl/7.29.0 和 x-custom-a: test。

根据 HTTP Method + \n + HTTP URI + \n + canonical_query_string + \n + access_key + \n + Date + \n + signed_headers_string + \n,得到完整的 signing_string 为:

"GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT
User-Agent:curl/7.29.0
x-custom-a:test
"

Body请求体校验

当 validate_request_body 设置为 true 时,插件将计算请求 body 的 hmac-sha 值,并与请求 headers 中的 X-HMAC-DIGEST 的值进行校验。

X-HMAC-DIGEST: base64(hmac-sha())

X-HMAC-DIGEST: base64(hmac-sha(<body>))

如果没有请求 body,你可以将 X-HMAC-DIGEST 的值设置为空字符串的 HMAC-SHA。

注意:
当开启 body 校验时,为了计算请求 body 的 hmac-sha 值,该插件会把 body 加载到内存中,在请求 body 较大的情况下,可能会造成较高的内存消耗。
为了避免这种情况,你可以通过设置 max_req_body(默认值是 512KB)配置项来配置最大允许的 body 大小,body 超过此大小的请求会被拒绝。

测试插件

假设当前请求为:

curl -i http://127.0.0.1:9080/index.html?name=james&age=36 \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"

通过以下 Python 代码为上述请求生成签名 SIGNATURE:

import base64
import hashlib
import hmacsecret = bytes('my-secret-key', 'utf-8')
message = bytes("""GET
/index.html
age=36&name=james
user-key
Tue, 19 Jan 2021 11:33:20 GMT
User-Agent:curl/7.29.0
x-custom-a:test
""", 'utf-8')hash = hmac.new(secret, message, hashlib.sha256)# to lowercase base64
print(base64.b64encode(hash.digest()))
Type Hash
SIGNATURE 8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=

你也可以参考 Generating HMAC signatures 了解如何使用不同的编程语言生成签名。

签名生成后,你可以通过以下示例使用生成的签名发起请求:

curl -i "http://127.0.0.1:9080/index.html?name=james&age=36" \
-H "X-HMAC-SIGNATURE: 8XV1GB7Tq23OJcoz6wjqTs4ZLxr9DiLoY4PxzScWGYg=" \
-H "X-HMAC-ALGORITHM: hmac-sha256" \
-H "X-HMAC-ACCESS-KEY: user-key" \
-H "Date: Tue, 19 Jan 2021 11:33:20 GMT" \
-H "X-HMAC-SIGNED-HEADERS: User-Agent;x-custom-a" \
-H "x-custom-a: test" \
-H "User-Agent: curl/7.29.0"HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Tue, 19 Jan 2021 11:33:20 GMT
Server: APISIX/2.2
......

你也可以将签名放到请求头 Authorization 字段中:

curl http://127.0.0.1:9080/index.html \
-H 'Authorization: hmac-auth-v1# + ACCESS_KEY + # + base64_encode(SIGNATURE) + # + ALGORITHM + # + DATE + # + SIGNED_HEADERS' -i

postman测试结果

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

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

相关文章

[PNPM Workspace] 搭建Monorepo工程

pnpm + workspace 前置知识 思考🤔:什么是工作空间? 答案:工作空间可以看作是一个共享的区域,所有用于工作的资源都可以从这个区域获取到。 生活中工作空间 在这个工作空间中,通常会包含与工作相关的所有工具和资源,比如办公桌、电脑、文具和文件柜等。这个工作空间是一…

欧拉22.03系统freerdp安装

欧拉22.03系统freerdp安装 1、按照欧拉22.03版本最小化安装,系统安装后安装xfce桌面环境 使用默认yum源,不用更新系统 1)安装字库 # dnf install dejavu-fonts liberation-fonts gnu-*-fonts google-*-fonts2)安装Xorg # sudo dnf install xorg-*3)安装XFCE及组件 # sudo …

leetcode每日一题:最小化字符串长度

题目 2716. 最小化字符串长度 给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次:在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符。并在 i 左侧(如果有)和 右侧(如果有)各 删除 一个距离 i 最近 的字符 c 。请你通过执行上述操作任意次,使 s 的长…

PVE 状态信息查询

PVE 状态信息查询 2025年1月8日 14:38 存储列表查询 #pvesm status 例子:pvesm status | awk NR>1{print$1":\t"$3"\t"$7} ZFS文件系统查询 #zpool status 例子:zpool status | sed -n /NAME/,/^$/p | sed -n s/\t//p 以下操作必须开启虚拟机选项…

模型上下文协议(MCP)简介

模型上下文协议(MCP)简介 人工智能的快速发展,特别是大型语言模型(llm),在生成类人文本、解决复杂问题和提高各行业生产力方面释放了前所未有的潜力。然而,一个持续存在的挑战仍然存在:这些模型通常与为现代工作流程提供动力的实时动态数据隔离。将 AI 连接到外部系统-…

TS学习-1

TS简介TypeScript由微软开发,是基于JavaScript的一个扩展语言。 TypeScript 包含了 JavaScript 的所有内容,即: TypeScript 是 JavaScript 的超集. TypeScript 需要编译为 JavaScript ,然后交给浏览器或其他 JavaScript 运行环 境执⾏。 TS静态检查,不需要运行就可以…

出海企业数字化为什么需要双层架构ERP?工博深度解析SAP ERP公有云方案

企业海外业务扩张时,可能由于文化差异、经验差异、合规要求和不断变化的地理政治环境等因素,使总部系统的在海外的推广充满挑战。双层架构ERP通过分层部署策略,帮助企业在保持总部控制力的同时,赋予子公司敏捷性与创新力。Gartner将其定义为IT双模式,第1层专注于业务流程中…

PVE RAID模拟恢复案例

PVE RAID模拟恢复案例 2024年10月10日 14:28 https://www.bilibili.com/read/cv32149324/ 1、正常环境现象,看raid磁盘信息和状态 root@pve:/var/lib/vz/dump# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 1007K 0 part ├─sda2 …

23593243

2353243谢芷欣

27.7K star!这个SpringBoot+Vue人力资源管理系统,让企业开发事半功倍!

`微人事(vhr)`是一款基于**SpringBoot+Vue**全栈技术打造的企业级人力资源管理系统,采用前后端分离架构设计,整合了Redis缓存、RabbitMQ消息队列、WebSocket实时通信等12+项企业级技术方案。项目自开源以来已获得**27.7K星标**,被广泛应用于中小企业的人事管理系统搭建。嗨,…

如何告别电脑卡顿烦恼?90%人未必知道的远程操作1分钟学会!

不知道你们有没有经历过这样的困扰,当电脑使用了一段时间后发现就不再像刚购买时那么丝滑流畅了?卡顿、等待程序、界面响应的情况常有发生,一次两次或还可接受,多次出现可就要令人头疼不已了。 无论是处理工作文件过程中的突然卡死,还是畅玩游戏时的画面冻结,都会严重影响…