node.js https.get()触发错误ECONNREFUSED

时间:2013-04-10 14:48:46

标签: node.js facebook-graph-api https

OAuth舞蹈的一个步骤涉及交换通过回调接收的访问令牌代码。特别是对于Facebook服务器端身份验证,以下https GET请求返回响应正文中的访问代码:

https://graph.facebook.com/oauth/access_token?
  client_id=YOUR_APP_ID
  &redirect_uri=YOUR_REDIRECT_URI
  &client_secret=YOUR_APP_SECRET
  &code=CODE_GENERATED_BY_FACEBOOK

尝试连接时,Node.js会触发错误:

 https.get( /**String | Object*/ options, function ( res ) {
   res.setEncoding( 'utf8' );

   res.on( 'data', function ( data ) {
     // parse response body
   } );

 } ).on( 'error',function ( e ) {
      Log.w( TAG, "Error requesting access_token", e );
 } ).end();

错误是:

{  code: 'ECONNREFUSED',
   errno: 'ECONNREFUSED',
   syscall: 'connect' }

这个调用与wget / curl一起工作正常,所以它不是传出防火墙规则等问题。节点请求有什么问题?

1 个答案:

答案 0 :(得分:10)

原来问题是https证书验证失败。来自节点的https.request()docs

  

rejectUnauthorized :如果为true,则根据提供的CA列表验证服务器证书。如果验证失败,则会发出“错误”事件。在发送HTTP请求之前,验证发生在连接级别。默认为真。

除非明确提供,否则http [s]。[request | get]将使用忽略tls.connect()选项的全局代理,包括 rejectUnauthorized 标志。因此需要修改对get(或request)的调用:

var options = require('url').parse( /**String*/ url );
options.rejectUnauthorized = false;
options.agent = new https.Agent( options );

https.get( /**Object*/ options, function ( res ) {
  // handle response & body
} ).on( 'error',function ( e ) {
  // handle errors
} ).end();