Как добавить JWT и проверку поля с помощью ExpressJS и multer - PullRequest
0 голосов
/ 25 июня 2019

У меня есть форма, которая нуждается в multipart / form-data, потому что в этой форме есть поле файла.

Я использую ExpressJS и использую multer для обработки multipart / formdata.

Теперь мне также нужно проверить поля и JWT в заголовке.

В моем приложении я использую промежуточное ПО для типа приложения / JSON и делаю это так:

app.delete("/ticket/:ticketId", [
    authValidation.validJWTNeeded,
    authValidation.verifyIfNotLoggedOut,
    authPermission.hasPermissionOrIsSameUser(staffRole),
    ticketController.deleteById
]);

В каждом промежуточном программном обеспечении я передаю аргументы (req, res, next) и возвращаю next при необходимости, и я отлично работаю.

Мне не удалось сделать это с помощью multer без предварительной отправки файла. В документации они будут делать что-то вроде этого, а это не то, что я хочу, потому что файл уже отправлен:

app.post("/route",
    multer.upload.single("avatar"),
    function (req, res, next) {
    // req.file is the `avatar` file
    // req.body will hold the text fields, if there were any
    })
)

Я пытался делать такие вещи, но это не сработало:

app.post("/ticket", [
    async (req, res, next) => {
    multer.upload.none();
    let jwt = //req.headers....... this is the jwt sent
    //req.body should have all the fields
    return next
    },
    authValidation.validJWTNeeded,               //Here i verify the JWT for auth
    authValidation.verifyIfNotLoggedOut,         //About the same here
    ticketController.verifyFields,               // /!\ I need to verify if fields are correct
    //function/middleware to upload using multer.upload.single("field"), 
    ticketController.insert                      // If everything above passed, then create the ticket and upload the file
]);

Итак, мой вопрос: как мне выполнить всю проверку, используя multer и данные, отправленные с шифрованием multipart / formdata?

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2019

Так что я решил обойти, это довольно грязный способ, imho, но он работает ... Я использовал fileFilter of multer и добавил в него всю необходимую проверку, включая проверку JWT, проверку поля и т. Д. Делая что-то вроде этого, если у кого-то есть более подходящий способ сделать это, пожалуйста, не стесняйтесь ответить.

//verify the jwt here

function isLoggedIn(req) {
    if (req.headers['authorization']) {
        try {
            let authorization = req.headers['authorization'].split(' ');
            if (authorization[0] !== 'Bearer') {
                return false
            } else {
                if(jwt.verify(authorization[1], config.jwt_secret)){
                    return true
                }
            }
        } catch (err) {
            return false
        }
    } else {
        return false
    }
}


//verify fields here
function verifField (req) {
    console.log(req.body.title)
    let fieldList = {
        title : false,
        message : false,
        category : false,
        response : false
    };

    if(req.body.title && req.body.title.trim() !== ""){
        fieldList.title = true;
    }

    if(req.body.message && req.body.message.trim() !== ""){
        fieldList.message = true;
    }

    if(req.body.category && ticketModel.ticketModel.schema.path("category").enumValues.includes(req.body.category)){
        fieldList.category = true;
    }

    if(!req.body.response){
        fieldList.response = true;
    }

    return fieldList.title &&  fieldList.message && fieldList.category && fieldList.response
}

//mix them both here + verify type    
function isValid (req) {
    return isLoggedIn(req) && verifField(req) && file.mimetype.match(/jpe|jpeg|png|gif$i/)
}

//export everything here
module.exports = {
    upload : multer({
        storage : storage,
        fileFilter : (req, file, cb) => {
            cb(null, isValid(req))
        }
    })
} ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...