如何从 Firefox 插件使用 Twitter 进行身份验证

How to authenticate with twitter from a firefox plugin

Echofon 在 2013 年 4 月左右放弃了他们的 firefox twitter 插件,但它一直在 github 上维护,直到最近对 twitter API 的一些更改破坏了它。

在正常使用中,认证应该遵循PIN-based authentication, but instead the request to https://api.twitter.com/oauth/request_token返回“{"errors":[{"code":32,"message":"Could not authenticate you."}] }'"状态='401'

我认为问题出在TwitterClient.buildOAuthHeader函数

TwitterClient.buildOAuthHeader = function (user, method, url, param)
{
  var ts = Math.ceil(Date.now() / 1000);
  var diff = EchofonUtils.timestampDiff();
  if (diff != 0) {
    EchofonUtils.debug("local timestamp " + ts + " / server timetsamp " + (ts + diff));
    ts += diff;
  }

  var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  var result = {};
  var data = converter.convertToByteArray(user + Date.now() + url + Math.random(), result);
  var ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
  ch.init(ch.MD5);
  ch.update(data, data.length);
  var hash = ch.finish(false);

  var s = convertToHexString(hash);

  var oauthparam = {"oauth_consumer_key"     : OAUTH_CONSUMER_KEY,
            "oauth_timestamp"        : ts,
            "oauth_signature_method" : "HMAC-SHA1",
            "oauth_nonce"            : s + Math.random(),
            "oauth_version"          : "1.0"};

  if (user.oauth_token) {
    oauthparam["oauth_token"] = EchofonAccountManager.instance().get(user.user_id).oauth_token;
  }

  var dict = {};
  for (var key in param) dict[key] = param[key];
  for (var key in oauthparam) dict[key] = oauthparam[key];

  var paramStr = encodeURLParameter(dict);

  var base = [method, RFCEncoding(url), RFCEncoding(paramStr)].join("&");

  var signature;
  var secret = user.oauth_token_secret ? EchofonAccountManager.instance().get(user.user_id).oauth_token_secret : "";
  var signature = EchofonSign.OAuthSignature(base, secret);

  oauthparam['oauth_signature'] = signature;

  var headers = [];
  for (var key in oauthparam) {
    headers.push(key + '="' + RFCEncoding(oauthparam[key]) + '"');
  }
  headers.sort();

  return headers.join(",");
}

我在 dev.twitter.com 注册了一个新的应用程序,我使用的是来自该应用程序的消费者密钥,而不是存储库中的消费者密钥。

此外,我已将 oauth_callback 属性添加到 oauthparam object,并将值设置为 "oob",详见 PIN-based身份验证 link 以上,但插件未使用 API.

正确验证

授权中需要更改什么 header 才能更正此问题?

此问题已解决。 有关如何在此处安装插件的补丁版本的说明 - https://github.com/echofox-team/echofon-firefox-unofficial/issues/85#issuecomment-581843812