Enviar datos desde Node js a SAP usando servicios ODATA
Hola comunidad SAP en español.
Me gustaría compartir con ustedes este pequeño código que me permite enviar datos a SAP desde Node.js, tuve que leer un poco sobre la libreria “request” en Node y conceptos sobre manejo de cookies en programación. En este caso puntual de la conexión a SAP desde Node no estaba muy claro que ademas del token crsf era necesario también compartir las cookies entre el metodo GET y POST. Inicialmente estaba pasando solo el token por esto se generaba el error HTTP 403 (Forbidden), este ejemplo incluye el manejo del token crsf y las cookies. Algo que tengo que mencionar es que al principio era muy confuso debido a que el servicio ODATA lo estaba probando con Postman y funcionaba solo obteniendo y pasando el token (ademas de las credenciales), la verdad es que parece que Postman hace el trabajo de manejar las cookies, por eso no fue fácil detectar que faltaba eso en mi código.
La variable j es donde se almacenan las cookies, esta la obtenemos con el metodo GET e igualmente la debemos pasar al metodo POST en el parametro jar, lo mismo se hace con el parametro x-crsf-token.
El servicio es un servicio SAP odata donde la autenticación es basic, el parametro pData contiene la entidad json a ser pasada como el cuerpo del request POST.
var request = require('request');
async function doCall(pData){
var token;
var j = request.jar();
var postDataToSAP = function(){
return new Promise(function(resolve, reject){
request({
url : url,
jar : j,
headers: {
"Authorization": "Basic USERANDPWINBASE64",
"x-csrf-token" : "Fetch"
}
}, function(error, response, body){
token = response.headers["x-csrf-token"];
console.log("Obtenido el token csrf");
request({
url:url,
method: 'POST',
jar: j,
headers:{
"Authorization":"Basic USERANDPWINBASE64",
"Content-Type":"application/json",
"X-CSRF-Token":token, // set CSRF Token for post or update
},
json: pData
}, function(error, response, body){
console.log("Datos de indicadores transferidos a SAP de forma exitosa");
resolve();
});
});
});
}
await postDataToSAP();
}
Este tipo de conexiones se aprovechan mucho cuando vas a implementar por ejemplo IoT, en este caso Node js es un lenguaje muy apropiado para eso.
Ahora el desafió que tengo es llamar el mismo servicio pero ya publicado en SCP con el servicio odata provisioning, digo que es un desafió para mi porque en este caso no puedo usar basic authentication ya que SCP no permite esto cuando se usa un IdP custom (Nosotros estamos usando SAP Cloud Identity), antes con el IdP SAP ID (IdP por defecto de SCP) si era posible, así que me toca estudiar un poco el protocolo saml2 y como puedo autenticarme por programación, apenas logre hacerlo escribiré un blog de con las instrucciones.
Si tienen alguna duda no duden en preguntar.
Jhon Jairo.