Ejecute el script js para actualizar requestBody antes de redirigir

Ejecute el script js para actualizar requestBody antes de redirigir

Estoy configurando una ubicación nginx pero necesito ejecutar un script (njs) que actualice requestBody antes de la redirección:

Esta es mi configuración, pero cuando la implemento todavía redirige sin actualizar el cuerpo de solicitud o devolver el error.

Nginx.conf principal:

     // .....
     js_import checkScript from  /etc/nginx/js/scripts/checkScript.js;
     // ....

En checkScript.js:

export default {
    rights
}

function rights(r) {
    const body = JSON.parse(r.requestBody);
    if (body.isAdmin) {
        body.rights = ['ADMIN'];
        r.requestBody = JSON.stringify(body);
    } else {
        r.return(403, 'Not admin');
    }
}

productos.http-service.conf:

location /api/data/products/new {
    set $gateway_role "dev.yumStore";
    set $gateway_realm "yumStore";

    auth_request /_tokenExchange;

    # check rights and update body
    js_content checkScript.rights;

    proxy_set_header "Authorization" $gateway_auth_header;

    # redirection
    proxy_pass $OUTGATEWAY/api/data/products/new;
}

¡¡Gracias por la ayuda!!

Respuesta1

Está actualizando una copia local del documento JSON en su función.

No sé si esto está permitido, pero puedes intentar:

function rights(r) {
    const body = JSON.parse(r.requestBody);
    if (body.isAdmin) {
        body.rights = ['ADMIN']
        r.requestBody = JSON.stringify(body); // I don't know if nginx JS allows overwriting the requestBody...
    } else {
        r.return(403, 'Not admin');
    }
}

Espero que además de esto tengas una autenticación adecuada para tu parte de administrador, ya que este enfoque es realmente sencillo de eludir.

Respuesta2

Supongamos que envía el cuerpo detrevnia nginx, un módulo njs que invierte la cadena en invertedproxy_pass a un servidor ascendente que responderá con echoing: inverted.

La siguiente configuración funciona para la prueba anterior. Espero eso ayude.

predeterminado.conf:

js_import main from invert.js;

server {
    
    location /ping {
        return 200 'pong';
    }

    location / {
        js_content main.invert;
    }

    location /api {
        proxy_pass http://host.docker.internal:5015;
    }
}

invertir.js

async function invert(r) {
  let body = r.requestText;
  let inverted = body.split("").reverse().join("");
  let res = await r.subrequest("/api", { body: inverted });
  r.return(res.status, res.responseBody);
}

export default { invert };

API

const server = new Server(5015, async (request, response) => {
  const incoming = await payload(request);
  const answer = `echoing: ${incoming}`;
  console.log("answering with", answer);
  response.writeHead(200, { "content-type": "text/plain" });
  response.write(answer);
  response.end();
});

El código se puede encontrar aquí:https://github.com/ericminio/learning-nginx/tree/master/njs-modify-body

información relacionada