8

OAuth ダンスのステップの 1 つは、コールバックを介して受信したコードをアクセス トークンと交換することです。特に 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() docsから:

rejectUnauthorized : true の場合、サーバー証明書は提供された CA のリストに対して検証されます。検証に失敗すると、「エラー」イベントが発行されます。検証は、HTTP 要求が送信される前に、接続レベルで行われます。デフォルトは真です。

明示的に指定しない限り、http[s].[request|get] は、 rejectUnauthorizedフラグを含むtls.connect()オプションを無視するグローバル エージェントを使用します。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();
于 2013-04-10T14:48:45.593 に答える