
Я настраиваю местоположение nginx, но мне нужно запустить скрипт (njs), который обновляет requestBody перед перенаправлением:
Это моя конфигурация, но когда я развертываю ее, она все равно перенаправляет без обновления requestBody или возвращает ошибку
Родительский nginx.conf:
// .....
js_import checkScript from /etc/nginx/js/scripts/checkScript.js;
// ....
В 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');
}
}
products.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;
}
Спасибо за помощь!!
решение1
Вы обновляете локальную копию документа JSON в своей функции.
Я не знаю, разрешено ли это, но вы можете попробовать:
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');
}
}
Надеюсь, у вас есть надлежащая аутентификация для вашей административной части в дополнение к этому, так как этот подход действительно легко обойти.
решение2
Допустим, вы отправляете тело detrevni
в nginx, модуль njs, который преобразует строку в inverted
proxy_pass на вышестоящий сервер, который ответит echoing: inverted
.
Следующая конфигурация работает для теста выше. Надеюсь, она поможет.
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;
}
}
инвертировать.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 };
апи
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();
});
Код можно найти здесь:https://github.com/ericminio/learning-nginx/tree/master/njs-modify-body