Führen Sie ein JS-Skript aus, um den RequestBody vor der Umleitung zu aktualisieren.

Führen Sie ein JS-Skript aus, um den RequestBody vor der Umleitung zu aktualisieren.

Ich konfiguriere einen Nginx-Speicherort, muss aber ein Skript (njs) ausführen, das den Anforderungstext vor der Umleitung aktualisiert:

Dies ist meine conf, aber wenn ich es bereitstelle, wird es immer noch umgeleitet, ohne den RequestBody zu aktualisieren oder einen Fehler zurückzugeben

Übergeordnete nginx.conf:

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

In 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');
    }
}

produkte.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;
}

Danke für die Hilfe!!

Antwort1

Sie aktualisieren eine lokale Kopie des JSON-Dokuments in Ihrer Funktion.

Ich weiß nicht, ob das erlaubt ist, aber Sie können es versuchen:

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');
    }
}

Ich hoffe, dass Sie darüber hinaus über eine ordnungsgemäße Authentifizierung für Ihren Administratorbereich verfügen, da dieser Ansatz wirklich einfach zu umgehen ist.

Antwort2

Angenommen, Sie senden den Text detrevnian nginx, ein NJS-Modul, das den String in umwandelt inverted, und einen Proxy-Pass an einen Upstream-Server, der mit antwortet echoing: inverted.

Die folgende Konfiguration funktioniert für den obigen Test. Ich hoffe, sie hilft.

Datei default.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;
    }
}

invertieren.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();
});

Der Code ist hier zu finden:https://github.com/ericminio/learning-nginx/tree/master/njs-modify-body

verwandte Informationen