在用于身份验证的Houndify API文档中,有以下内容块:
验证请求的示例
让我们假设我们有以下信息:
UserID: ae06fcd3-6447-4356-afaa-813aa4f2ba41
RequestID: 70aa7c25-c74f-48be-8ca8-cbf73627c05f
Timestamp: 1418068667
ClientID: KFvH6Rpy3tUimL-pCUFpPg==
ClientKey: KgMLuq-k1oCUv5bzTlKAJf_mGo0T07jTogbi6apcqLa114CCPH3rlK4c0RktY30xLEQ49MZ-C2bMyFOVQO4PyA=={user_id};{request_id}{timestamp}ae06fcd3-6447-4356-afaa-813aa4f2ba41;70aa7c25-c74f-48be-8ca8-cbf73627c05f1418068667myWdEfHJ7AV8OP23v8pCH1PILL_gxH4uDOAXMi06akk=。{user-id};{request-id}。继续上面的示例,这个标题的值是:猎犬-请求-身份验证:ae06fcd3-6447-4356-afaa-813aa4f2ba41;70aa7c25-c74f-48be-8ca8-cbf73627c05f{client-id};{timestamp};{signature}。继续上面的示例,此标头的值为:Hound-Client-Authentication: KFvH6Rpy3tUimL-pCUFpPg==;1418068667;myWdEfHJ7AV8OP23v8pCH1PILL_gxH4uDOAXMi06akk=对于第三条,它写着“用解码后的ClientKey签署消息”。"message“和"ClientKey”是两个截然不同的字符串。
我的问题是:如何用另一个字符串对一个字符串进行签名,也就是说,这到底意味着什么?你如何在JavaScript中做到这一点?
var message = 'my_message';
var key = 'signing_key';
//??what next??我试图弄清楚这一切,这样我就可以在Postman中创建一个预请求脚本来执行适当的HmacSHA256哈希操作。
发布于 2016-02-05 16:11:59
根据文档,如果您使用的是其中一个SDK,它将自动验证您的请求:
SDK已经为您处理身份验证。您只需为SDK提供创建时为客户端生成的客户端ID和客户端密钥。如果您没有使用SDK,请使用右边的代码示例来生成您自己的HTTP头来验证您的请求。
但是,如果您想手动执行此操作,我相信您需要计算它们在您问题中的链接中描述的字符串的HMAC值,然后将其作为请求中Hound-Client-Authentication头的一部分进行base64编码。他们提供了一个node.js示例
var uuid = require('node-uuid');
var crypto = require('crypto');
function generateAuthHeaders (clientId, clientKey, userId, requestId) {
if (!clientId || !clientKey) {
throw new Error('Must provide a Client ID and a Client Key');
}
// Generate a unique UserId and RequestId.
userId = userId || uuid.v1();
// keep track of this requestId, you will need it for the RequestInfo Object
requestId = requestId || uuid.v1();
var requestData = userId + ';' + requestId;
// keep track of this timestamp, you will need it for the RequestInfo Object
var timestamp = Math.floor(Date.now() / 1000),
unescapeBase64Url = function (key) {
return key.replace(/-/g, '+').replace(/_/g, '/');
},
escapeBase64Url = function (key) {
return key.replace(/\+/g, '-').replace(/\//g, '_');
},
signKey = function (clientKey, message) {
var key = new Buffer(unescapeBase64Url(clientKey), 'base64');
var hash = crypto.createHmac('sha256', key).update(message).digest('base64');
return escapeBase64Url(hash);
},
encodedData = signKey(clientKey, requestData + timestamp),
headers = {
'Hound-Request-Authentication': requestData,
'Hound-Client-Authentication': clientId + ';' + timestamp + ';' + encodedData
};
return headers;
};发布于 2016-02-06 01:34:33
因此,在这种特殊情况下,签名基本上意味着除了使用键之外,还使用哈希算法创建字符串的哈希,而不是像MD5这样的无键哈希。例如:
var message = 'my_message';
var key = 'signing_key';
var hashed_message = hash_func(message, key);其中,hash_func是一种哈希算法,如HmacSHA256 (所讨论的哈希算法)。
我试图找出这一点的原因是使用Postman测试Houndify API的身份验证。幸运的是,Postman有一个很好的特性,叫做预请求脚本,它配有散列算法,如果您需要预生成需要与请求一起发送的值,就可以帮助您。
经过多次修改后,我成功地创建了一个预请求脚本,该脚本正确地验证了这个API (参见下面的代码)。
var unescapeBase64Url = function (key) {
return key.replace(/-/g, '+').replace(/_/g, '/');
},
escapeBase64Url = function (key) {
return key.replace(/\+/g, '-').replace(/\//g, '_');
},
guid = function() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
};
var client_id_str = environment["client-id"];
var client_key_str = environment["client-key"];
var user_id_str = environment["user-id"];
var request_id_str = guid();
var timestamp_str = Math.floor(Date.now() / 1000);
var client_key_dec_str = CryptoJS.enc.Base64.parse(unescapeBase64Url(client_key_str));
var message_str = user_id_str+";"+request_id_str+timestamp_str;
var signature_hash_obj = CryptoJS.HmacSHA256(message_str, client_key_dec_str);
var signature_str = signature_hash_obj.toString(CryptoJS.enc.Base64);
var hound_request_str = user_id_str+";"+request_id_str;
var hound_client_str = client_id_str+";"+timestamp_str+";"+escapeBase64Url(signature_str);
postman.setEnvironmentVariable("hound-request-authentication", hound_request_str);
postman.setEnvironmentVariable("hound-client-authentication", hound_client_str);请注意,您必须在Postman中为客户端id、客户端密钥和用户id以及头变量猎犬请求身份验证和猎犬客户端身份验证创建环境变量,以保存定义标头时将引用的最终值。
希望能帮上忙。
https://stackoverflow.com/questions/35228114
复制相似问题