2011-09-22 13 views
7

Spędziłem większość dzisiejszych prób wdrożenia implementacji API XAuth firmy Instapaper. Nawet nie udało mi się zdobyć żetonu Oautha.Instapaper API i JavaScript XAuth

Jakieś pomysły, co robię źle?

Używam node.js i modułu oauth. Rozumiem, że muszę podać nazwę użytkownika, hasło, tryb AMD jako dodatkowe parametry. Moduł oauth powinien zająć się wszystkimi parametrami oautha. Ale nie jest. Oto kod:

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) 
}); 

I to wraca to:

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

nadal jestem walić głową o ten . Proszę pomóż. –

+0

Czy zdarzyło Ci się, że to działa? Umieszczenie działającego rozwiązania lub oznaczenie rozwiązania jako poprawnej odpowiedzi byłoby wspaniałe –

Odpowiedz

5

więc nie jestem pewien, czy jest to błąd z modułu oauth czy Instapaper API jest zbyt restrykcyjne w parsowania nagłówki Authorization, ale musiałem dodać spację po przecinku dla ogranicznika nagłówka. W każdym razie wydaje się, że powoduje to wszystkie problemy (400 błędów).

oauth obecnie buduje nagłówki jak:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret... 

musiała być

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret... 

I zmodyfikowany plik oauth.js aby odzwierciedlać. https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

dodaje spację po przecinku w kierunku końca linii

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

Oto mój przykładowy klient pracy:

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); 

    }); 

}); 

Nadzieja to pomaga!

+0

Czy to nadal jest "działająca" próba? Wygląda na to, że to nie działa, ponieważ od tego czasu podpis dla "getOAuthAccessToken" uległ zmianie, chyba że jest coś, czego mi brakuje. –

+0

Paul (i wszyscy inni, którzy stoją przed tym samym problemem jak ja), można użyć 'getOAuthRequestToken (x_auth_params, callback)' zamiast (testowane z node-oauth v0.9.8). Poprawka z brakującymi polami w nagłówku Authorization jest nadal potrzebna. Pamiętaj, aby ustawić requestUrl również podczas tworzenia nowej instancji OAuth (na 'https: // www.instapaper.com/api/1/oauth/access_token'). –

1

Odpowiedź Derek jest zgodna co do brakującej przestrzeni jako problemu, ale nie trzeba edytować oauth.js.

Po utworzeniu klienta OAuth, wystarczy ustawić ciąg separatora:

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

(tak, „separatora”, jest literówka w kodzie modułu)