Javascript TwitterRESTAPI:错误的身份验证数据
我正试图发布一条推特,但由于任何原因,它并没有像预期的那样工作 我怀疑这个问题可能与Javascript TwitterRESTAPI:错误的身份验证数据,javascript,angularjs,twitter,Javascript,Angularjs,Twitter,我正试图发布一条推特,但由于任何原因,它并没有像预期的那样工作 我怀疑这个问题可能与签名字符串有关,但按照twitter根据请求所说的做似乎没问题 这是我的密码: function postTweet(user_id, AccessToken, AccessTokenSecret) { var base_url = 'https://api.twitter.com/1.1/statuses/update.json', oauth_nonce = randomString(),
签名
字符串有关,但按照twitter根据请求所说的做似乎没问题
这是我的密码:
function postTweet(user_id, AccessToken, AccessTokenSecret) {
var base_url = 'https://api.twitter.com/1.1/statuses/update.json',
oauth_nonce = randomString(),
oauth_signature,
oauth_timestamp = Math.floor(new Date().getTime() / 1000),
reqArray,
req,
signature_base_string,
signing_key;
reqArray = [
"include_entities=true",
'oauth_consumer_key="' + CONFIG.TWITTER_CONSUMER_KEY + '"',
'oauth_nonce="' + oauth_nonce + '"',
'oauth_signature_method="HMAC-SHA1"',
'oauth_timestamp="' + oauth_timestamp + '"',
'oauth_token="' + AccessToken + '"',
'oauth_version="1.0"',
'status=' + encodeURIComponent("hello world")
];
req = reqArray.sort().join('&');
signature_base_string = "POST&" + encodeURIComponent(base_url) + "&" + encodeURIComponent(req);
signing_key = CONFIG.TWITTER_CONSUMER_KEY_SECRET + '&' + AccessTokenSecret;
oauth_signature = encodeURIComponent(CryptoJS.HmacSHA1(signature_base_string, signing_key).toString(CryptoJS.enc.Base64));
return $http.post('https://api.twitter.com/1.1/statuses/update.json', {
status: 'hello world'
}).then(function (response) {
return response;
}).catch(function (error) {
console.log(error);
});
}
作为回应,我得到:
更新
考虑到我的项目中已经有了$cordovaauthutility
,我开始这样使用它:
function postTweet(accessToken, accessTokenSecret) {
var params, signature;
params = {
include_entities: true,
oauth_consumer_key: CONFIG.TWITTER_CONSUMER_KEY,
oauth_nonce: $cordovaOauthUtility.createNonce(10),
oauth_signature_method: "HMAC-SHA1",
oauth_token: accessToken,
oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
oauth_version: "1.0"
};
signature = $cordovaOauthUtility.createSignature('POST', 'https://api.twitter.com/1.1/statuses/update.json', params, { status: "hello" }, CONFIG.TWITTER_CONSUMER_KEY_SECRET, accessTokenSecret);
return $http.post('https://api.twitter.com/1.1/statuses/update.json', {
status: "hello"
}, {
headers: {
Authorization: signature.authorization_header
}
})
.then(function (response) {
return response;
}).catch(function (error) {
console.log(error);
});
}
更新2
在尝试了所有的可能性之后,问题仍然存在。我在这里粘贴了一个我有代码的地方。您正在使用crypto的
HmacSHA256
,但将HMAC-SHA1
作为oauth\u签名方法
参数发送,该参数是twitter参数
您可能应该将代码更改为
oauth_signature = CryptoJS.HmacSHA1(signature_base_string, signing_key).toString(CryptoJS.enc.Base64);
如果查看授权
标题,还可以注意到它有问题。实际上,您可以看到,oauth\u nonce
和oauth\u版本
前面有一个&
符号,这不应该是这种情况,很可能意味着api没有指定它们。这可能是因为您正在使用相同的reqArray
来构造签名和标头,或者您的代码没有更新
您可能也不想更改从应用程序发送的全局标头,以防另一个请求同时发送到另一个api。相反,您应该只为这个特定的xhr发送这个授权
头
return $http.post('https://api.twitter.com/1.1/statuses/update.json', {
status: 'hello world',
}, {
headers: {
Authorization: auth,
},
})
很明显,您在请求数组中添加了
oauth_令牌
,但它没有显示在屏幕截图中?参数中的AccessToken是否未定义
编辑
根据,我们必须在标题中附加双引号。试试这个
reqArray = [
"include_entities=true",
'oauth_consumer_key="'+CONFIG.TWITTER_CONSUMER_KEY+'"',
'oauth_nonce="'+oauth_nonce+'"',
'oauth_signature_method="HMAC-SHA1"',
'oauth_timestamp="'+oauth_timestamp+'"',
'oauth_token="'+AccessToken+'"',
'oauth_version="1.0"',
'status='+encodeURIComponent("hello world")
];
哎呀
我已经下载了您的plnkr包并添加了一个只读应用程序密钥集。我只需设置并进行一次更改即可获得{“请求”:“\/1.1\/statuses\/update.json”,“错误”:“只读应用程序无法发布”。}
响应。最初我收到的是{“errors”:[{“code”:32,“message”:“无法验证您的身份。”}]}
从创建签名的花括号{}
中删除状态:“hello”
。
signature = $cordovaOauthUtility.createSignature('POST', 'https://api.twitter.com/1.1/statuses/update.json', params, { }, twitter.consumer_secret, twitter.access_token_secret);
我的请求标题如下所示:
:authority:api.twitter.com
:method:POST
:path:/1.1/statuses/update.json
:scheme:https
accept:application/json, text/plain, */*
accept-encoding:gzip, deflate, br
accept-language:en-US,en;q=0.8
authorization:OAuth oauth_consumer_key="x",oauth_nonce="QFMmqiasFs",oauth_signature_method="HMAC-SHA1",oauth_token="y",oauth_timestamp="1496340853",oauth_version="1.0",oauth_signature="7Ts91LKcP%2FrYsLcF5WtryCvZQFU%3D"
content-length:18
content-type:application/json;charset=UTF-8
origin:http://localhost
referer:http://localhost/twits/
user-agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
谷歌搜索最终让我找到了一个教程:。我注意到他的常规createTwitterSignature
函数不接受参数,并对代码进行了类似的调整
function createTwitterSignature(method, url) {
var token = angular.fromJson(getStoredToken());
var oauthObject = {
oauth_consumer_key: clientId,
oauth_nonce: $cordovaOauthUtility.createNonce(10),
oauth_signature_method: "HMAC-SHA1",
oauth_token: token.oauth_token,
oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
oauth_version: "1.0"
};
var signatureObj = $cordovaOauthUtility.createSignature(method, url, oauthObject, {}, clientSecret, token.oauth_token_secret);
$http.defaults.headers.common.Authorization = signatureObj.authorization_header;
}
我读过关于为什么应该/不应该有其他参数的相互矛盾的东西,但我相信签名只是作为访问的基础,不会在您想要执行的每个操作中散列-请参见。您是否也可以添加开发工具显示的请求?我附上了我的请求的捕获@JonSampsonI not see“包括联合国实体“作为api docs@JeremyHamm中的一个可接受参数,根据,
include_entities=true
是生成签名所必需的参数您是对的,但不幸的是,问题仍然存在。我已经更新了包含修复程序的代码。@DevStarlight我不适合编辑,忘记了我已经更新了令牌丢失的图片。仍然不起作用,但现在它删除了“需要授权”而不是“错误的身份验证数据”。我已经更新了我的主映像&my code.Dang。我又查了一遍文件。编码后,>>>6。如果还有键/值对,请附加逗号“,”和空格“”。你能用空格试试看它是否有效吗?像那样'status='+encodeURIComponent(“hello world”)+'
现在,我想在加入和编码之前是这样的:OAuth OAuth_token=“GmHxMAgYy”,OAuth_version=“1.0”你能把它改成这个吗OAuth OAuth_token=“GmHxMAgYy”,OAuth_version=“1.0”最后,签名中的参数之间出现冲突!使其正常工作。谢谢!