iFrame + PDF.js + puppeteer - хорошая комбинация для создания и отображения файлов PDF? - PullRequest
0 голосов
/ 25 сентября 2019

с понедельника я пытаюсь найти правильный способ быстрой и безопасной генерации и отображения 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) для обеспечения безопасности пользователя разрешено?Для меня важно, чтобы панель просмотра (как видно на скриншоте) была доступна.

диаграмма текущей процедуры

1 Ответ

0 голосов
/ 26 сентября 2019

Я думаю, что нашел решение.

схема логики нового подхода / токена

Использование токена (хеш или случайная строка) только для получения файла PDFдолжен сделать это.

Токен не аутентифицирует пользователя.Я думаю, что это более безопасный подход?

Не стесняйтесь комментировать / ответить:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...