Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TwitterRESTAPI:错误的身份验证数据_Javascript_Angularjs_Twitter - Fatal编程技术网

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”最后,签名中的参数之间出现冲突!使其正常工作。谢谢!