Использование токена CSRF из GET и использование его в POST |403 Запрещено |AWS Lambda - PullRequest
0 голосов
/ 19 сентября 2018

Я создаю функцию node.js через aws lambda, которая отправляет запрос GET в Hybris Market Place и получает токен CSRF.Затем я использую этот токен, чтобы сделать еще один запрос POST для публикации некоторых данных в Hybris Marketplace, но я получаю сообщение об ошибке 403 Forbidden.То же самое работает в Postman, который, как я полагаю, благодаря POSTMAN поддерживает сеанс GET и, следовательно, токен CSRF все еще действует.Как я могу добиться этого в функции AWS Lambda.Ниже мой код.Я использую обещание сделать два запроса.

const https = require('https');

exports.handler = async (event, context, callback) => {

const tokenOptions = {
     "host": "*******.s4hana.ondemand.com",
     "path": "/sap/opu/odata/sap/***********/",
     "port": null,
     "headers":{
                 "authorization": "Basic ************=",
                 "cache-control": "no-cache",
                 "x-csrf-token": "fetch"
               },
     "method": "GET"
 };

var getToken = (tokenOptions) => {
  return new Promise((resolve,reject)=>{

        const req = https.request(tokenOptions, (res) => {

              var xToken = res.headers["x-csrf-token"];
              var sCookies = res.headers["set-cookie"];
              var response = [xToken,sCookies]
              res.on('data', () => {
                    console.log('Successfully processed HTTPS response');
                    resolve(response);
                  });
                  res.on('end', () => {
                    });
                  });
        req.on('error', function(){
            reject('Request to get token failed.');
        });
          req.end();

    });
};

    var postContent = (response) => {
      return new Promise((resolve,reject)=>{

        var options = {
          "method": "POST",
          "host": "*********-***.s4hana.ondemand.com",
          "path": "/sap/opu/odata/sap/*********/*******",
      "port":null,
      "headers":
       { "authorization": "Basic *******==",
         "x-csrf-token": response[0],
         "accept": "application/json",
         "content-type": "application/json",
         "cache-control": "no-cache",
       },
      "cookie":response[1],
      "body":
       { 
     /* Data I want to POST */
       },
      "json": true
     };


        const req = https.request(options, (res,data) => {
            console.log(res.statusCode);
                  res.on('data', () => {
                    resolve('Successfully submitted.');
                  });
                  res.on('end', () => {

                    });
                  });
        req.on('error', function(err,res){
            reject('Request to get Post failed.');
        });
        req.end();    
    });
};

getToken(tokenOptions).then((response) =>{
  console.log('Result: ' +response[0]);
  return postContent(response);
}).then((successMsg) =>{
  callback(null,successMsg);
}).catch((errMsg)=>{
  callback();
});

};
...