javascript - Twitter Oauth 1.0 签名创建,如何将“二进制字符串”转换为 base64
问题描述
截至目前,我正在为 Twitter 的 OAuth 1.0 创建签名。
我正在关注这个。
最后我遇到了一个小问题。
他们有
84 2B 52 99 88 7E 88 7602 12 A0 56 AC 4E C2 EE 16 26 B5 49
他们设法创造
hCtSmYh+iHYCEqBWrE7C7hYmtUk=
他们的解释是将“二进制字符串”编码为base64。
我在这个stackoverflow问题中看到我基本上需要解码十六进制然后编码base64来获取
84 2B 52 99 88 7E 88 7602 12 A0 56 AC 4E C2 EE 16 26 B5 49
至
hCtSmYh+iHYCEqBWrE7C7hYmtUk=
它在在线计算器中工作,所以现在我需要将它实现为 javascript,Base64 编码工作正常,看起来像这样:
Buffer.from("ExampleString").toString('base64')
然而,十六进制解码似乎是我从这里得到解决方案的问题。
这是我的十六进制解码器
String.prototype.hexDecode = function(){
var j;
var hexes = this.match(/.{1,4}/g) || [];
var back = "";
for(j = 0; j<hexes.length; j++) {
back += String.fromCharCode(parseInt(hexes[j], 16));
}
return back;
}
当我使用“我的”解码器和在线计算器时,我得到一个不同的字符串,知道吗?
解决方案
在这里找到答案
function oAuthSignature(base_string, signing_key) {
var signature = hmac_sha1(base_string, signing_key);
return percentEncode(signature);
};
var jsSHA = require('jssha');
function hmac_sha1(string, secret) {
let shaObj = new jsSHA("SHA-1", "TEXT");
shaObj.setHMACKey(secret, "TEXT");
shaObj.update(string);
let hmac = shaObj.getHMAC("B64");
return hmac;
};
function percentEncode(str) {
return encodeURIComponent(str).replace(/[!*()']/g, (character) => {
return '%' + character.charCodeAt(0).toString(16);
});
};
如果有人愿意解释答案,请随意,因为我很想理解它。