我是开发人员,我正在寻找一些软件来提供我们的QA,以测试需要SHA1 HMAC身份验证的REST API(每个请求均使用用户的密钥签名,此处描述了此过程)。我使用Postman或Rest Console,但无法按要求设置请求签名。有一些工具可以完成这项工作吗?

upd。我尝试写邮递员的请求前脚本没有运气。如果有人有兴趣继续工作,我可以分享我的作品。

评论

这是添加到http标头中的内容,对吗?类似于基于令牌的身份验证。您是否尝试过通过HTTP客户端整理http包?奏效了吗?

是的,在http标头中。请求数据会使用时间戳记和密钥进行哈希处理,因此应该在每个请求开始之后但在将其发送到服务器之前预先计算标头。我没有尝试过http包,不确定您的意思。

您使用什么语言?我举个例子。

正如我写的:“我正在寻找一些软件来提供我们的质量保证进行测试”。我有一个运行良好的API客户端,但我无法将其提供给质量检查人员,并说“只要学习一些编程,就可以了” :)

哦,对不起,我明白你的意思了!让我仔细阅读一下流程说明,我们将看看我是否可以说些聪明的话。

#1 楼

请注意,当我编写此jQuery时,它是内置在Postman中的。自v4.5.0以来,它已被CheerioJS和Lodash取代,因此该解决方案不适用于v4.5.0 +。 。这是我的操作方法:

根据Postman文档,您不能直接设置请求标头。在请求前脚本中,您必须将标头值分配给全局变量或环境变量,然后在标头键值编辑器中使用标头变量。

下面是在标头:



这是我编写的请求前脚本,用于生成所需的值并分配给标头变量:

var key = 'my_api_key';
var base64Secret = 'my_b64_secret';

function newGuid() {
    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : r & 0x3 | 0x8; return v.toString(16); });
}

function epochTime() {
    var d = new Date();
    var t = d.getTime();
    var o = t + "";
    return o.substring(0, 10);
}

// Load required 3rd party JS libs via jQuery
// http://stackoverflow.com/a/11803418

$.when(
    $.getScript( "https://cdnjs.cloudflare.com/ajax/libs/jsSHA/2.0.1/sha256.js" ),
    $.getScript( "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js" ),
    $.getScript( "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js" ),
    $.Deferred(function( deferred ){
        $( deferred.resolve );
    })
).done(function(){

    var time = epochTime();
    var nonce = newGuid();
    var method = request.method;
    var encodedUri = encodeURIComponent(request.url).toLowerCase();

    // Build the request body string from the Postman request.data object
    var requestBody = "";
    var firstpass = true;
    for(var param in request.data)
    {
        if(!firstpass){
            requestBody += "&";
        }
        requestBody += param + "=" + request.data[param];
        firstpass = false;
    }

    var b64BodyContent = "";
    if(requestBody){
        // MD5 hash and convert the request body string to base 64
        b64BodyContent = CryptoJS.MD5(requestBody).toString(CryptoJS.enc.Base64);
    }

    var rawSignature = key + method + encodedUri + time + nonce + b64BodyContent;

    // Generate HMAC SHA256 signature
    // Using library: http://caligatio.github.io/jsSHA/
    var shaObj = new jsSHA("SHA-256", "TEXT");
    shaObj.setHMACKey(base64Secret, "B64");
    shaObj.update(rawSignature);
    var signature = shaObj.getHMAC("B64");

    postman.setEnvironmentVariable('key', key);
    postman.setEnvironmentVariable('time', time);
    postman.setEnvironmentVariable('nonce', nonce);
    postman.setEnvironmentVariable('signature', signature);
});


评论


这绝对是太好了。在一个简单的答案中,您提供了比Postman网站甚至更具指导性的有关预请求脚本的教程。干得好先生!

–皮尔斯
16-2-3在20:38

我的抱怨$ jquery字符。您是否必须告诉邮递员以某种方式使用jquery?

–乔·菲利普斯(Joe Phillips)
18年5月2日在23:15

看来jquery已删除,现在使用了cheerio?虽然不确定如何翻译...

–乔·菲利普斯(Joe Phillips)
18年5月2日在23:28

#2 楼

我知道这是一个旧线程,但是我发现它希望解决相同的问题。答案之一建议在Postman中使用JQuery不再可行,已被弃用。但是最后我使用的是Postman的当前版本(撰写本文时为v4.3.9)。

Postman的pre-request脚本使您可以访问请求正文并允许您设置环境变量,然后可用于设置请求的标头值。该脚本还使您可以访问一些流行的库,包括CryptoJS。

因此,在预请求脚本编辑器中,粘贴

postman.setGlobalVariable("hmac", CryptoJS.HmacSHA256(request.data, <secret>));


然后,在标头编辑器中,使用全局hmac变量的值设置HMAC标头,例如:

#3 楼

我的评论没有足够的声誉,@ David使我进入了当前版本的正确社区。查看包含全局变量的Postman Sandbox文档。

我需要一个签名标头,它是请求有效负载的sha1哈希,我通过添加标头来实现此目的: /> [{"key":"signature","value":"{{signature}}","description":"","enabled":true}]

,并使用预请求脚本计算哈希:

pm.globals.set("signature", CryptoJS.HmacSHA1(request.data, "secret"));

#4 楼

我不确定我是否正确理解了您的问题,但是我最好的猜测是您正在尝试为auth生成密钥。您可以尝试https://quickhash.com/

评论


抱歉,那行不通。在发送请求之前,需要自动计算哈希值。没有人会手动复制-粘贴请求数据(这是不可能的,因为哈希包含仅在发送请求时才知道的请求时间戳)。

– Aldekein
2015年1月15日,下午2:26

#5 楼

您是否看过SoapUI?这是相当全面,相当强大的工具,并且对于测试REST服务的质量保证也相当了解。

评论


我刚刚对“ + soapUI hmac sha1”进行了Google搜索,但没有6个结果相关。

– Aldekein
15年4月16日在10:28

@Aldekein,这是因为您的用例非常具体,SoapUI是框架而不是语言。 SoapUI可以使用groovy脚本来设置属性,在这里可以创建sha1哈希。希望能有所帮助。

–chrisc
15年4月16日在10:31