首页 > 解决方案 > 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;
}

当我使用“我的”解码器和在线计算器时,我得到一个不同的字符串,知道吗?

标签: javascriptoauthtwitter-oauthoauth-1.0a

解决方案


在这里找到答案

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);
  });
};

如果有人愿意解释答案,请随意,因为我很想理解它。


推荐阅读