2011-09-22 51 views
7

我今天大部分時間都在嘗試實現Instapaper的XAuth API。我甚至還沒有能夠獲得oauth標記。Instapaper API&Javascript XAuth

任何想法我做錯了什麼?

我正在使用node.js和oauth模塊。這是我的理解,我需要通過用戶名,密碼,AMD模式作爲額外的參數。 oauth模塊應該處理所有的oauth參數。但事實並非如此。下面的代碼:

var OAuth = require('oauth').OAuth; 

var oauth = new OAuth(
 '', 
 'https://www.instapaper.com/api/1/oauth/access_token', 
 'CONSUMER_KEY', 
 'CONSUMER_SECRET', 
 '1.0', 
 null, 
 'HMAC-SHA1', 
 null 
); 

var extra = { 
 'x_auth_username': 'USERNAME', 
 'x_auth_password': 'PASSWORD', 
 'x_auth_mode': 'client_auth' 
}; 
var hello = oauth._prepareParameters('', '', 'POST', 'https://www.instapaper.com/api/1/oauth/access_token', null); 
var url = 'https://www.instapaper.com/api/1/oauth/access_token'; 
var f = true; 
for (var i in hello) { 
 if (f) { 
   url += '?'; 
   f = false; 
 } else { 
   url += '&'; 
 } 
 url += hello[i][0] + '=' + hello[i][1]; 
} 
console.log(url+'&x_auth_mode=client_auth&x_auth_username=&x_auth_password=') 
oauth._performSecureRequest('', '', "POST", url+'&x_auth_mode=client_auth&x_auth_username=&x_auth_password=', null, null, null, function(error, data, response) { 
 console.log(error, data) 
}); 

,並返回此:

{ statusCode: 401, 
    data: 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]' } 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]'} 
+0

我還在敲我的頭這。請幫忙。 –

+0

你有沒有得到這個工作?發佈工作解決方案或將解決方案標記爲正確答案會很好 –

回答

5

所以我不知道這是否與oauth模塊或者的Instapaper的API是解析Authorization頭過於嚴格的錯誤,但是我必須在標題分隔符的逗號後添加一個空格。無論如何,這似乎是造成所有問題(400錯誤)。

目前的OAuth積聚標題爲:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret... 

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret... 

需要我修改了oauth.js文件,以反映這一點。

var OAuth = require('oauth').OAuth; 

var consumerKey = 'chill'; 
var consumerSecret = 'duck'; 

var oa = new OAuth(
    null, 
    'https://www.instapaper.com/api/1/oauth/access_token', 
    consumerKey, 
    consumerSecret, 
    '1.0', 
    null, 
    'HMAC-SHA1' 
); 

var x_auth_params = { 
    'x_auth_mode': 'client_auth', 
    'x_auth_password': 'yourpass', 
    'x_auth_username': '[email protected]' 
}; 

oa.getOAuthAccessToken(null, null, null, x_auth_params, function (err, token, tokenSecret, results) { 

    // CAN HAZ TOKENS! 
    console.log(token); 
    console.log(tokenSecret); 

    // ZOMG DATA!!! 
    oa.get("https://www.instapaper.com/api/1/bookmarks/list", token, tokenSecret, function (err, data, response) { 

    console.log(data); 

    }); 

}); 

希望這有助於: https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

朝向線

authHeader+= "" + this._encodeData(orderedParameters[i][0])+"=\""+ this._encodeData(orderedParameters[i][1])+"\", "; 

這是我工作的客戶樣本的結束逗號後加一個空格!

+0

這仍然是一個「工作」示例嗎?似乎它不起作用,因爲「getOAuthAccessToken」的簽名已經發生了變化,除非我缺少某些東西。 –

+0

Paul(以及其他所有面臨與我一樣的問題的人),您可以使用getOAuthRequestToken(x_auth_params,callback)代替(使用node-oauth v0.9.8測試)。授權標頭中缺少空格的修復程序仍然是必需的。儘管(在https:// www.instapaper.com/api/1/oauth/access_token中),請務必在創建新的OAuth實例時設置requestUrl。 –

1

德里克的回答是關於作爲問題的缺失空間是正確的,但你不需要編輯oauth.js

創建OAuth用戶端後,只要設置分隔字符串:

var OAuth = require('oauth').OAuth; 
var oa = new OAuth({...}); 
oa._oauthParameterSeperator = ', '; 

(是的,「分隔符」,有一個在模塊的代碼一個錯字)