Node.js中的https.get()触发错误ECONNREFUSED

9

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命令可以正常工作,因此不存在出站防火墙规则等问题。那么node请求出了什么问题?

1个回答

12

问题原来是https证书验证失败。根据node的https.request() 文档:

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

除非明确提供,否则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();

谢谢。我遇到了类似的问题。 - Nate
@Venkat,你知道你可以接受自己的(优秀的)答案 :) - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接