Использование внешнего REST API с Lambda Node.js с установленным клиентским сертификатом - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь использовать внешний API для пользователя, который требует использования сертификата клиента TLS. Предварительно указав, что используемый мной сертификат правильно работает с POSTMAN, где я получаю правильный ответ от того же API, я не могу установить sh соединение для вызова внутри моей функции Lambda, получая ошибку CONNECTION RESET.

Спасибо всем, кто может помочь! Андреа

Следует код:

    function getBearerTokenFromProvider(session,callback) {
    console.log('getBearerTokenFromProvider - start');
    var https = require('https');   
    var querystring = require('querystring');
    var bearer = '';
    var isEndedOk;
    var postData = querystring.stringify({
        grant_type: 'client_credentials',
        client_id: 'xxxxxxxxxxxxxxx',
        client_secret: 'xxxxxxxxxxxxx',
        scope: 'sandbox'
    });
    // preparing the call parameters
    var postOptions = {
                host: 'api.provider.com',
                path: '/auth/oauth/v2/token',
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Content-Length': postData.length
                },
                // agentOptions to manage the TLS mutual authentication certificates usage
                agentOptions: {
                //certificate is available in deploy package
                pfx: fs.readFileSync(process.env.LAMBDA_TASK_ROOT + '/certishere/cert.p12'),
                passphrase: 'certpass'
                }
    };
    console.log('postOptions= ' + JSON.stringify(postOptions));
    console.log('postData= ' + JSON.stringify(postData));
   // Setting up the request
   var post_req = https.request(postOptions, function(res) {
      var statusCode = res.statusCode;
      let error;
      console.log('statusCode=' + statusCode); 
      if (statusCode !== 200) {
        error = new Error('Request Failed.\n' +
                          `Status Code: ${statusCode}`);
      }
      res.setEncoding('utf8');
      let rawData = '';
      res.on('data', (chunk) => { rawData += chunk; });
      res.on('end', () => {
      console.log('Content della postReq= ' + String(post_req));
        try {
          const  parsedData = rawData;
          console.log('String(parsedData)=' + String(parsedData));
          if (error) {
                isEndedOk = false;
                console.error(error.message);
                console.error('Response Content=' + String(parsedData));
                // Consume response data to free up memory
                res.resume();
          } else {
                isEndedOk = true;
                console.log('Response Content=' + String(parsedData));
                bearer = JSON.parse(parsedData);
                bearer = bearer.token_type + ' ' + bearer.access_token; 
                console.log('Bearer Token=' + bearer);
          }         
          callback(session.attributes,
                callBack_getBearerTokenFromProvider(bearer, statusCode, session, callback, isEndedOk));
                console.log('getBearerTokenFromProvider - result: ' + isEndedOk);  
        } catch (e) {
          console.error(e.message);
        }
      });
    }).on('error', (e) => {
      console.error(`Got error: ${e.message}`);
    });
    post_req.write(postData);
    post_req.end();
}
...