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

OAuth舞蹈的其中一个步骤是将通过callback接收到的代码交换为访问令牌。 特别是对于Facebook服务器端身份validation,以下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工作正常,所以它不是一个传出的防火墙规则或类似的问题。 节点请求有什么问题?

原来问题是https证书validation失败。 从节点的https.request() 文档 :

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

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

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