如何从 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
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