我正在尝试一些具体的东西,即尝试调用 REST API。我一直在遵循这些说明。
我一直非常小心地确保我正确地创建了“签名基本字符串”。他们将其定义为这样创建:
(HTTP 方法)&(请求 URL)&(规范化参数)
您可以仔细检查我的代码中是否需要,但我非常确定它没问题。
我遇到的问题是创建他们所谓的“oauth 签名”,而我的与他们的不匹配。它们应该像这样创建:
使用 [RFC2104] 定义的 HMAC-SHA1 签名算法对请求进行签名,其中 text 是 Signature Base String,key 是 Consumer Secret 和 Access Secret 的连接值,由 '&' 字符分隔(显示 '&'即使 Access Secret 为空,因为某些方法不需要访问令牌)。
计算出的摘要八位字节字符串,首先按照 [RFC2045] 进行 base64 编码,然后使用 [RFC3986] 百分比编码 (%xx) 机制进行转义,即 oauth_signature。
我在我的代码中这样表达:
var oauthSignature = CryptoJS.HmacSHA1(signatureBaseString, sharedSecret+"&");
var oauthSignature64 = encodeURIComponent(CryptoJS.enc.Base64.stringify(oauthSignature));
console.log("hash in 64: " + oauthSignature64);
我正在使用谷歌的 CryptoJS 库。我将签名基本字符串作为文本,然后将我的消费者秘密作为与“&”连接的密钥,我没有访问密钥,它不是必需的,但没关系。然后我对该哈希的结果进行base 64编码,然后我对其进行URI编码,请一些人理智地检查我对它的理解以及我在使用这个库的代码中对它的使用/表达,我认为这就是我的问题所在。
这是我的完整代码:
var fatSecretRestUrl = "http://platform.fatsecret.com/rest/server.api";
var d = new Date();
var sharedSecret = "xxxx";
var consumerKey = "xxxx";
//this is yet another test tyring to make this thing work
var baseUrl = "http://platform.fatsecret.com/rest/server.api?";
var parameters = "method=food.search&oauth_consumer_key="+consumerKey+"&oauth_nonce=123&oauth_signature_method=HMAC-SHA1&oauth_timestamp="+getTimeInSeconds()+"&oauth_version=1.0&search_expression=banana";
var signatureBaseString = "POST&" + encodeURIComponent(baseUrl) + "&" + encodeURIComponent(parameters);
console.log("signature base string: " + signatureBaseString);
var oauthSignature = CryptoJS.HmacSHA1(signatureBaseString, sharedSecret+"&");
var oauthSignature64 = encodeURIComponent(CryptoJS.enc.Base64.stringify(oauthSignature));
console.log("hash in 64: " + oauthSignature64);
var testUrl = baseUrl+"method=food.search&oauth_consumer_key=xxxx&oauth_nonce=123&oauth_signature="+oauthSignature64+"&oauth_signature_method=HMAC-SHA1&oauth_timestamp="+getTimeInSeconds()+"&oauth_version=1.0&search_expression=banana";
console.log("final URL: " + testUrl);
var request = $http({
method :"POST",
url: testUrl
});
我已经注意确保我发布的参数按字典顺序排列,并且我非常确定它是正确的。
我得到的回应是:
无效签名:oauth_signature 'RWeFME4w2Obzn2x50xsXujAs1yI='
很明显
- 我没有理解 API 中提供的说明
- 或者我已经理解它们,但我没有在我的代码中以这种方式表达它们
- 或以上两者
- 或者我在看不到的地方犯了一些微妙的错误
我真的很感激一个健全性检查,这需要一段时间。