2012-01-08 44 views
1

所以我試圖無法從twitter獲取令牌。 我收到以下錯誤:「無法驗證oauth簽名和令牌」。 我讀過它可能是由於您的系統時鐘錯誤。 在javascript中我測試了我的日期下面的代碼使用JavaScript的Twitter OAuth Request_Token,可能是錯誤的時間?

var minutes=1000*60; 
var hours=minutes*60; 
var days=hours*24; 
var years=days*365; 
var d=new Date(); 
var t=d.getTime(); 
var y=t/years; 
console.log((y+1970) + " year and " + (t%years)/days) 

這給了我一年爲2012 17天.. 1972年 1976年 1980年 1984年 1988年 1992年 1996年 2004年 _ _ = 10閏日。今天是第8名,因此我想系統時鐘在7號出現,所以我要跳過這個閏日?或者我在這裏犯了一個錯誤?如果這是問題,我該如何修復我的時鐘?

在cmd當我做日期cmd它給了我今天的日期,即第8。

這是我的發佈請求和代碼,以防問題出在代碼中而不是時鐘。

我的POST請求:

POST http://api.twitter.com/oauth/request_token?oauth_callback=127.0.0.1&oauth_consumer_key=FFZJrBaPLsiwTDg5159tTQ&oauth_nonce=tWHEEIW8vLS6tMggo3IXe6e449qv1GpE8LunKRsbRF&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1326039495&oauth_version=1.0&oauth_signature=d%2BQqgTzJCjYIp9vKwm%2BCWzVLPvA 

它得到401(未授權)

這裏是我的javascript代碼。

var url = "http://api.twitter.com/oauth/request_token"; 

var params={ 
oauth_callback : "127.0.0.1" 
,oauth_consumer_key : "FFZJrBaPLsiwTDg5159tTQ" 
,oauth_nonce : OAuth.nonce(42) 
,oauth_signature_method : "HMAC-SHA1" 
,oauth_timestamp : OAuth.timestamp() 
,oauth_version: "1.0"} 

//temp is to be the signature base string 
var temp = toSignParams("POST",url,params); 
console.log(temp); 
//This logs the signature base string as "POST&http%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3D127.0.0.1%26oauth_consumer_key%3DFFZJrBaPLsiwTDg5159tTQ%26oauth_nonce%3D5gQVIa3WmwD6ARGGQTITl1Ozgxe2t8em5HC7g8wvMi%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1326038871%26oauth_version%3D1.0" 
//which is correct I think. 
//When I use this with the base signature from twitters oauth example page I get the result they got. 
//it hashes the twitter signing key with base signature. 
params.oauth_signature = b64_hmac_sha1("MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&",temp); 


var req = new XMLHttpRequest(); 
req.open("POST",toURIParams(url,params),true); 
req.send(); 

console.log(params) 

req.onreadystatechange=function(){ 
if (req.readyState==4) 
    { 
    console.log(req.responseText); //this is saying "Failed to validate oauth signature and token" 
    } 
} 

//function to convert to Signature paramaters, as indicated on twitter page. 
function toSignParams(method,base,params){ 
    tail=[]; 
    for (var p in params) { 
     if (params.hasOwnProperty(p)) { 
      tail.push(p + "%3D" + encodeURIComponent(params[p])); 
     } 
    } 
    return method + "&" + encodeURIComponent(base) + "&" + tail.join("%26") 
} 

//function to convert to uri encoded parameters. 
function toURIParams(base, params) { 
    tail = []; 
    for (var p in params) { 
    if (params.hasOwnProperty(p)) { 
     tail.push(p + "=" + encodeURIComponent(params[p])); 
    } 
    } 
    return base + "?" + tail.join("&") 
} 

任何想法?

+0

我決定使用JavaScript的推特庫來代替。 – James 2012-01-10 18:55:00

+1

發佈JS庫作爲答案並接受答案。這會在他們遇到你的問題時幫助其他人。 – JSuar 2013-01-16 13:31:33

+1

「我讀過它可能是由於您的系統時鐘錯誤導致的......」在完全混淆了一個小時之後才解決了我的問題,這是爲什麼昨天早上一些OAuth代碼被破壞的原因! – 2013-02-03 09:59:43

回答

0

我使用了一個名爲「jsOAuth-1.3.3」的庫,如在與JavaScript兼容的庫列表中找到的,但不再存在。

他們現在列出2個JavaScript選項是:由@AivisSilins

  • 用戶流 - 一個簡單的Node.js的用戶流客戶端 和
  • codebird-JS通過@mynetx - 一個Twitter圖書館JScript中。

https://dev.twitter.com/docs/twitter-libraries

如發現如果有人有一個問題,即他們不能得到任何這些解決方案的工作,我可以嘗試在網上找到或上傳我的地方使用的庫。