8

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,因此它不是传出防火墙规则等问题。节点请求有什么问题?

4

1 回答 1

12

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

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

除非明确提供,否则 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();
于 2013-04-10T14:48:45.593 回答