с понедельника я пытаюсь найти правильный способ быстрой и безопасной генерации и отображения PDF-файлов со следующим - может быть, я просто растерян или не вижу ответа:
Apache - запускает мои PHP-скрипты дляМой реальный проект (порт 443) NodeJS - запускает один скрипт для генерации PDF-файлов из HTML (порт 8080)
Что мне нужно: Убедитесь, что пользователю разрешено создавать и просматривать PDF.Для меня важно, чтобы панель просмотра (как видно на скриншоте) была доступна.
Существует файл cookie, в котором хранится хэш сессии и на котором пользователь аутентифицируется при каждом запросе (дляпример через AJAX).
Описание полной процедуры: На одной странице моего проекта отображается iFrame.При этом загружается PDF-просмотрщик (из PDF.js) и несколько кнопок вокруг него: состояние до того, как все начнется
Нажатие на кнопку слева (названо «Загрузить»).PDF 1 ", ...) запускает следующее событие:
$(document).on("click", ".reportelement", function () {
//some data needs to be passed
let data = "report=birthdaylist";
//point iFrame to a new address
$("#pdfViewer").attr("src", "https://example.org/inc/javascript/web/viewer.html?file=https://example.org:8080?" + data);
});
В этот момент iFrame собирается перезагрузить средство просмотра, которое принимает аргумент GET и выполняет его:
https://example.org/inc/javascript/web/viewer.html?file=https://example.org:8080?" + data //sends the data to the NodeJS script and recieves PDF
==> ?file=https://example.org:8080 //GET... it's bad... How to do a POST in iFrame?!
Итак, взгляните на NodeJS Script (я должен сказать, что я не очень знаком с async и NodeJS):
const https = require("https");
const fs = require("fs");
const puppeteer = require('puppeteer');
const url = require("url");
var qs = require('querystring');
const request = require("request-promise");
const options = {
key: fs.readFileSync("key.pem", "utf-8"),
cert: fs.readFileSync("cert.pem", "utf-8"),
passphrase: 'XXXXXXXX'
};
https.createServer(options, function (req, res) {
(async function () {
if (req.method == 'POST') {
var body = '';
req.on('data', function (data) {
body += data;
// Too much POST data, kill the connection!
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
if (body.length > 1e6)
req.connection.destroy();
});
req.on('end', function () {
//got a selfsigned certificate only, will change it soon!
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
(async function () {
var result = await request.post('https://example.org/index.php', {
//htpasswd secured at the moment
'auth': {
'user': 'user',
'pass': 'pass',
'sendImmediately': false
},
//i would like to send the cookie oder the hash in it
//or something else to it ensure, that the user is allowed to
form: {
giveme: 'html'
}
},
function (error, response, body) {
//for debugging reasons
console.log("error: " + error);
console.log("response: " + response);
console.log("body: " + body);
}
);
const browser = await puppeteer.launch();
const main = async () => {
//generating pdf using result from request.post
}
const rendered_pdf = await main();
res.writeHead(200, {
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept",
"Access-Control-Allow-Origin": "*",
'Content-Type': 'application/pdf',
'Content-Disposition': 'attachment; filename=mypdf.pdf',
'Content-Length': rendered_pdf.length
});
res.end(rendered_pdf);
})();
});
} else if (req.method == 'GET') {
console.log("we got a GET");
} else {
console.log("we got NOTHING");
}
})();
}).listen(8080);
Все работает хорошо, и PDF отображаются хорошо - но как яКак уже упоминалось ранее, я не знаю, как гарантировать, что пользователю разрешено создавать и просматривать PDF.
tldr;
Есть ли способ (возможно, безiFrame) для обеспечения безопасности пользователя разрешено?Для меня важно, чтобы панель просмотра (как видно на скриншоте) была доступна.
диаграмма текущей процедуры