为了账号安全,请及时绑定邮箱和手机立即绑定

通过 Postman 进行 HMAC 身份验证

通过 Postman 进行 HMAC 身份验证

C#
皈依舞 2021-10-23 17:01:17
我正在使用一个示例为 Web API 项目设置 HMAC 身份验证。我试图让 Postman 在它的预请求脚本中构建和发送 GET 请求。但是请求总是以 401 失败,我不知道为什么。邮递员预请求脚本:var AppId = "4d53bce03ec34c0a911182d4c228ee6c";var APIKey = "A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=";var requestURI = "http%3a%2f%2flocalhost%3a55441%2fapi%2fv1%2fdata";var requestMethod = "GET";var requestTimeStamp = "{{$timestamp}}";var nonce = "1";var requestContentBase64String = "";var signatureRawData  = AppId + requestMethod + requestURI + requestTimeStamp +  nonce + requestContentBase64String; //checkvar signature = CryptoJS.enc.Utf8.parse(signatureRawData);var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);var signatureBytes = CryptoJS.HmacSHA256(signature,secretByteArray)var requestSignatureBase64String = CryptoJS.enc.Base64.stringify(signatureBytes);postman.setGlobalVariable("key", "amx " + AppId + ":" + requestSignatureBase64String + ":" + nonce + ":" + requestTimeStamp);
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这是我在 Pre-Script 中使用的代码。它适用于任何查询 GET、PUT、POST、DELETE。


您需要更改 AppId 和 APIKey 值,并在最后一行调整环境变量“hmacKey”的名称。


function interpolate (value) {

    const {Property} = require('postman-collection');

    return Property.replaceSubstitutions(value, pm.variables.toObject());

}


var uuid = require('uuid');

var moment = require("moment")


var hmacPrefix = "hmac";

var AppId = "4d53bce03ec34c0a911182d4c228ee6c";

var APIKey = "A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=";

var requestURI = encodeURIComponent(pm.environment.values.substitute(pm.request.url, null, false).toString().toLowerCase());

var requestMethod = pm.request.method;

var requestTimeStamp = moment(new Date().toUTCString()).valueOf() / 1000;

var nonce = uuid.v4();

var requestContentBase64String = "";

var bodyString = interpolate(pm.request.body.toString());


if (bodyString) {

    var md5 = CryptoJS.MD5(bodyString);

    requestContentBase64String = CryptoJS.enc.Base64.stringify(md5);

}


var signatureRawData  = AppId + requestMethod + requestURI + requestTimeStamp +  nonce + requestContentBase64String; //check

var signature = CryptoJS.enc.Utf8.parse(signatureRawData);

var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);

var signatureBytes = CryptoJS.HmacSHA256(signature,secretByteArray);

var requestSignatureBase64String = CryptoJS.enc.Base64.stringify(signatureBytes);


var hmacKey = hmacPrefix + " " + AppId + ":" + requestSignatureBase64String + ":" + nonce + ":" + requestTimeStamp;

postman.setEnvironmentVariable("hmacKey", hmacKey);


查看完整回答
反对 回复 2021-10-23
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

它实际上与 Postman 提供的所有事物的可变占位符有关。在测试占位符 {{$timestamp}} 的面值时传递了一个有效值。当我剥离签名以仅从一个段开始时,我成功地进行了身份验证。当然,直到我把时间戳占位符放回去。

当我将占位符换成标题中传递的实际值时,它工作正常。我只能得出结论,一定有一些我看不到的额外字符。也许在邮递员方面创建签名时。该问题扩展到其他占位符,例如 {{$guid}}。


查看完整回答
反对 回复 2021-10-23
  • 2 回答
  • 0 关注
  • 357 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号