2013-07-12 5 views
0

J'ai un jeton support et j'essaie d'obtenir le scénario d'un utilisateur derrière un proxy avec le code suivant.Twitter 1.1 user_timline with Bearer Authorization renvoie 400 dans node.js

var parsedUrl = url.parse('https://api.twitter.com/1.1/statuses/user_timeline.json:443/?count=2&screen_name=twitterapi', true, true); 
var options = { 
    'host': parsedUrl.host, 
    'path': parsedUrl.path, 
    'method': 'GET', 
    'headers': { 
     'Host': parsedUrl.host, 
     'Authorization': 'Bearer ' + settings.accessToken 
    } 
}; 

var adapter = https; 
if(settings.proxy) 
{ 
    options.host = settings.proxy; 
    options.port = settings.proxyPort; 
    options.path = parsedUrl.path; 

    options.headers['Proxy-Connection'] = 'Keep-Alive'; 

    adapter = http; 
} 

var body = ''; 
var req = adapter.request(options, function(res) { 

    res.on('data', function (chunk) { 
     body += chunk; 
    }); 

    res.on('end', function() { 
     try 
     { 
      var result = JSON.parse(body); 
     } 
     catch(ex) 
     { 
     //... 
     } 
    }); 

}); 
req.end(); 

Cette requête renvoie toujours un 400 sans corps ou message d'erreur. Si essayer l'acces avec cUrl cela fonctionne comme un charme. Je récupère le jeton porteur de la même manière. Pourquoi Twitter répond-il avec un 400?

curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: Bearer <token>' --verbose --proxy http://proxy.example.com:8080 

Qu'est-ce que cUrl différemment?

EDIT: Le code d'état n'est PAS 404 mais 400! Pardon.

EDIT2: Lorsque je quitte l'en-tête Authorization, j'en reçois toujours 400 même si je m'attends à un message d'échec d'autorisation. Y a-t-il un besoin particulier?

EDIT3: Maintenant, le code d'état est 401. Quelque chose qui sent mauvais passe :(

Répondre

1

Voici l'astuce: Vous devez tunnel la connexion HTTPS sur la requête HTTP en utilisant CONNECT pour obtenir par le proxy La première façon. est faux

var http = require('http'); 
var https = require('https'); 

var connectReq = http.request({ // establishing a tunnel 
    host: 'localhost', 
    port: 3128, 
    method: 'CONNECT', 
    path: 'github.com:443', 
}).on('connect', function(res, socket, head) { 
    // should check res.statusCode here 
    var req = https.get({ 
    host: 'github.com', 
    socket: socket, // using a tunnel 
    agent: false // cannot use a default agent 
    }, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', console.log); 
    }); 
}).end(); 

Voir ci-dessous bug/problème Node.js pour plus de détails:. HTTPS request not working with proxy

Questions connexes