接口签名和postman预处理生成签名

nestjs后端代码

controller

 @Get('md5hmacSHA1b64')postMd5hmacSHA1b64(@Req() request: Request, @Query() query) {// 获取GET请求参数const queryParamsMap = new Map(Object.entries(query));return this.handleMd5hmacSHA1b64(queryParamsMap, request);}@Post('md5hmacSHA1b64')@UseInterceptors(NoFilesInterceptor())getMd5hmacSHA1b64(@Req() request: Request, @Body() formData) {//@Body() formData 支持 x-www-form-urlencoded 和 application/json 类型的请求, 但是不支持普通表单 form-data//form-data支持文件上传, x-www-form-urlencoded不支持文件上传//使用 @UseInterceptors(NoFilesInterceptor()) 让@Body()支持form-data键值对形式的非文件上传场景console.log('formData:', formData);//提取formData的键值对const query2 = new Map(Object.entries(formData));console.log('query2:', query2);return this.handleMd5hmacSHA1b64(query2, request);}private handleMd5hmacSHA1b64(queryParamsMap: Map<string, any>,request: Request,) {//获取header列表//const queryHeadersMap = new Map(Object.entries(request.headers));//queryHeadersMap 只取出指定header accessKeyId nonce timestampconst queryHeadersMap2 = new Map(Object.entries(request.headers).filter((item) =>item[0] === 'accesskeyid' ||item[0] === 'nonce' ||item[0] === 'timestamp' ||item[0] === 'sign',),);//queryHeadersMap2 的 key  accesskeyid 替换为 accessKeyIdqueryHeadersMap2.forEach((value, key) => {if (key === 'accesskeyid') {queryHeadersMap2.set('accessKeyId', value);queryHeadersMap2.delete('accesskeyid');}});//将上面两个map合并const allMap = new Map([...queryParamsMap, ...queryHeadersMap2]);return this.epgService.md5hmacSHA1b64(allMap);}private handleMd5hmacSHA1b64(queryParamsMap: Map<string, any>,request: Request,) {//获取header列表//const queryHeadersMap = new Map(Object.entries(request.headers));//queryHeadersMap 只取出指定header accessKeyId nonce timestampconst queryHeadersMap2 = new Map(Object.entries(request.headers).filter((item) =>item[0] === 'accesskeyid' ||item[0] === 'nonce' ||item[0] === 'timestamp' ||item[0] === 'sign',),);//queryHeadersMap2 的 key  accesskeyid 替换为 accessKeyIdqueryHeadersMap2.forEach((value, key) => {if (key === 'accesskeyid') {queryHeadersMap2.set('accessKeyId', value);queryHeadersMap2.delete('accesskeyid');}});//将上面两个map合并const allMap = new Map([...queryParamsMap, ...queryHeadersMap2]);return this.epgService.md5hmacSHA1b64(allMap);}

service代码

md5hmacSHA1b64(allMap: Map<string, any>) {const accessKeyId =process.env.ACCESS_KEY_ID;const accessKeySecret = process.env.ACCESS_KEY_SECRET;console.log(allMap);//遍历allMap列表,拷贝到headerMapconst sign = allMap.get('sign');console.log("sign", sign)const headerMap = {};for (const key of allMap.keys()) {// 去掉名为sign的keyif (key !== 'sign') {headerMap[key] = allMap.get(key);}}console.log('headerMap=', headerMap)//accessKeyId 替换为约定的accessKeyIdheaderMap['accessKeyId'] = accessKeyId;//对headerMap按字母排序const sortHeaderMap = {};Object.keys(headerMap).sort().forEach((key) => {sortHeaderMap[key] = headerMap[key];});console.log('sortHeaderMap=', sortHeaderMap);//对排序后的header拼接字符串 形如 key1=value1&key2=value2&key3=value3的形式,最后一项没有&let str = '';for (const key in sortHeaderMap) {str += key + '=' + sortHeaderMap[key] + '&';}str = str.substring(0, str.length - 1);//base64const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));//hmacsha1const hmacsha1 = CryptoJS.HmacSHA1(base64, accessKeySecret);//md5const md5 = CryptoJS.MD5(hmacsha1).toString();//判断sign==md5 若相等 返回check 字段为okreturn {str,md5hmacSHA1b64: md5,check: sign === md5?'ok':'no',};}

postman接口

header定义

pre-Request预处理脚本

// 辅助函数:补零
function padZero(num) {return num.toString().padStart(2, '0');
}
// 生成16位随机数,用于nonce
function generateRandom16bit() {return Math.random().toString(16).substring(2, 18);
}
//验证请求GET POST ok
let accessKeyId = "UC1"; //签名Key
let accessKeySecret = "UC2"; //签名secret
//let accessKeyId = pm.request.headers.get("accessKeyId");let param = {};
console.log("param:",param)// 获取当前时间戳
const now = new Date();
// 时间戳 格式化为指定样式  yyyyMMddHHmmss
const formattedTimestamp = now.getFullYear().toString() + // 年份padZero(now.getMonth() + 1) + // 月份,注意月份是从0开始的,所以加1padZero(now.getDate()) +padZero(now.getHours()) +padZero(now.getMinutes()) +padZero(now.getSeconds());//16位随机数
let nonce = generateRandom16bit()//头部参数
param['accessKeyId']=accessKeyId
param['nonce']=nonce
param['timestamp']=formattedTimestamp//Get 参数
let queryParam = pm.request.url.query.members;
console.log("queryParam:",queryParam)
for (let i in queryParam){param[queryParam[i].key] = queryParam[i].value;
}
//POST参数
let postParam = request.data;
console.log("postParam:",postParam)
if(typeof(postParam) == "string"){try{let dataJson = JSON.parse(postParam);// 将解析后的数据合并到param对象中Object.assign(param, dataJson);}catch(err){console.log(err)}
}else{Object.assign(param, postParam);
}console.log("allParam:",param)
//Post
//取key
var keys = [];
for (let k in param){if (k == 'sign'){continue;}keys.push(k); 
}
//排序
keys.sort();//取value
var kv = [];
for (let k of keys){kv.push(k + '=' + param[k]) }//拼接
var str = kv.join('&');console.log("str=",str)
//签名计算算法md5(hmacsha1(base64(str)))
const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
const hmacsha1 = CryptoJS.HmacSHA1(base64, accessKeySecret);
const md5 = CryptoJS.MD5(hmacsha1).toString();//设置环境变量
postman.setEnvironmentVariable("nonce", nonce);
postman.setEnvironmentVariable("timestamp", formattedTimestamp);
postman.setEnvironmentVariable("sign", md5);

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

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

相关文章

单点登录(SSO)前端怎么做

单点登录&#xff08;SSO&#xff09;前端怎么做 本文介绍单点登录&#xff08;SSO&#xff09;是什么&#xff0c;还有就是前端怎么做。 单点登录&#xff08;SSO&#xff09;是什么 单点登录&#xff08;SSO&#xff0c;Single Sign On&#xff09;&#xff0c;是在企业内部…

【再探】Java—Java 沙箱机制与类加载器

沙箱&#xff08;Sandbox&#xff09;机制是将Java程序限定在JVM特定的运行范围内&#xff0c;并严格限制代码对本地系统资源的访问&#xff0c;以保证代码的有效隔离&#xff0c;防止对本地系统造成破坏。 1 安全模型 类在加载过程中&#xff0c;类加载器会为类设置初始的安…

gstreamer+mpp调用硬解码播放视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、cpu解码二、gstreamermpp1.默认已安装2.没安装必要软件 总结 前言 以前一直在MPP上开发硬解码推理&#xff0c;最近想弄一个盒子支持调用mpp硬解码播放视频…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

QT Creator与QT的下载安装

0.起因/小结&#xff1a; 因为运行项目需要更高版本的QT。 下载了QT 6.2.0&#xff0c;但是里面的gcc&#xff0c;g&#xff0c;gdb是64bit的&#xff0c;而我的QT Creator是32bit的&#xff0c;所以又下载了QT 13.0.0的64bit版本。 遇到问题&#xff1a;msvcp140_1.dll找不到…

软件管理及部分命令

sed命令 格式&#xff1a; sed [选项] 操作 目标文件 选项&#xff1a; -i&#xff1a;修改原始文件【如果不加-i&#xff0c;那就是仅仅修改内存中的文件副本】 案例&#xff1a;将1.txt中的tom修改成jerry。 sed -i "s/tom/jerry/g" 1.txt 将1…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 对于一维信号&#xff0c;我们可以使用类似移动平均滤波&#xff08;Moving Average Filtering&#xff09;实现denoising。Moving Average Filtering 是一种…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

TPM 是什么?如何查看电脑的 TPM?

TPM 是什么&#xff1f; 首先我们来了解一下 TPM 是什么&#xff0c;TPM 由可信计算组织&#xff08;Trusted Computing Group&#xff0c;TCG&#xff09;开发&#xff0c;为了在提高计算机系统的安全性。随着网络安全威胁的不断增加&#xff0c;TPM 技术逐渐成为确保系统安全…

开源网关Apache APISIX启用JWT身份验证

说明&#xff1a; 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先&#xff0c;确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”&#xff0c;VS Code打开文件夹&#xff0c;打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

vite+ts设置别名

准备工作 安装 types/node 避免代码爆红 npm install types/node一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

618网购节,电商能挡住恶意网络爬虫的攻击吗?

目录 爬虫盗取电商数据的步骤 电商平台如何发现网络爬虫&#xff1f; 如何拦截违法网络爬虫 2023年&#xff0c;杭州中院审结了两起涉及“搬店软件”的不正当竞争案件。本案的原告是国内某大型知名电子商务平台的运营主体&#xff0c;而被告则是开发了一款名为“某搬家快速商品…

汽车分销商文件流转优化:实现稳定高效的文件分发处理

在汽车圈里&#xff0c;分销商可是个不可或缺的角色。他们既要跟汽车厂家紧紧绑在一起&#xff0c;还得跟下游的销售渠道或者直接跟消费者打成一片&#xff0c;文件来回传递那是家常便饭。 这文件发放的速度快不快&#xff0c;安不安全&#xff0c;直接影响到分销商做事的效率…

安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑

安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而&#xff0c;随着科技的进步&#xff0c;我们对时间管理和测量的方法已经发生了翻天覆地的变…

有哪些可以替代postman的接口测试软件?

替代Postman的接口测试软件有很多选择&#xff0c;其中一些流行的工具包括Insomnia、SoapUI、JMeter、Paw等。在本篇文章中&#xff0c;我将从0到1&#xff0c;详细介绍这些接口测试软件的使用方法和规范&#xff0c;帮助你选择适合的工具进行接口测试。 1. Insomnia Insomni…

手机怎么压缩视频?归纳了三种快速压缩方案

手机怎么压缩视频&#xff1f;在数字时代&#xff0c;手机已经成为我们记录生活的重要工具&#xff0c;而视频作为其中的一种主要形式&#xff0c;更是占据了极大的存储空间。然而&#xff0c;随着手机拍摄的视频越来越多&#xff0c;如何高效压缩视频以节省存储空间&#xff0…