ExpressJS применять JWT для URL файла - PullRequest
1 голос
/ 02 марта 2020

Итак, я пытаюсь сделать авторизацию для маршрутов с JWT, все работает, если используется на маршрутах.

app.get('/user/list', jwtMiddleware, action);

И содержимое jwtMiddleware (более или менее):

var token = req.headers.authorization;
    // decode token
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, process.env.SECRET_TOKEN, function(err, decoded) {
            if (err) {
                return res.status(401).send({
                    success: false,
                    message: 'Sign in to continue.'
                });
            } else {
                // if everything is good, save to request for use in other routes
                next();
            }
        });
    } else {
        // if there is no token
        // return an error
        return res.status(401).send({
            success: false,
            message: 'Sign in to continue.'
        });
    }

это работает, но у меня есть эти файлы изображений в папке uploads / , доступной по / upload / image-1.jpg , и я хочу запретить прямой доступ к /upload/image-1.jpg с использованием подстановочных маршрутов app.get('/upload*', jwtMiddleware, action);

, затем я пытаюсь получить доступ к случайному маршруту с upload , например / upload / test, промежуточное программное обеспечение JWT работает. Но если я явно наберу / upload / image-1.jpg , браузер просто покажет изображение, это похоже на промежуточное ПО или маршрутный символ ( / upload *), к которому нет доступа (консоль .log внутри промежуточного ПО даже не сработало).

Ранее я использовал restify и restify-jwt-middleware , он мог бы без проблем справиться с этим делом, но в express Я не могу понять, почему это не работает. Возможно, потому что restify-jwt-middleware автоматически регистрирует все маршруты в проверку jwt, тогда как express необходимо объявлять каждый маршрут с помощью промежуточного ПО jwt вручную.

есть что-нибудь, что я пропустить в этом случае? спасибо.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

В случае, если кто-то все еще запутался, вот мой ответ в express, который аналогичен подходу

// the fake route
app.get('uploads/:name', jwtMiddleware, (req, res, next) => {
    if (fs.existsSync('./realpath/' + req.params.name)) {
        res.sendFile('./realpath/' + req.params.name);
    } else {
        res.status(404).body({status : 'ERROR', message : 'File not found'});
    }
});

от yathomasi, таким образом, uploads / somefile.jpg обрабатывается как URL-адрес маршрута, а не как URL-адрес файла, и обрабатывается jwtMiddleware

1 голос
/ 02 марта 2020

добавить / изменить другой маршрут, например app.get('/upload/:image', jwtMiddleware, action)

, при этом будут проверены все маршруты, которые вы упомянули /upload/*

РЕДАКТИРОВАТЬ: поставить данные c файлы (например, загруженные файлы где-то вроде images/upload) и направьте их с помощью плагина serveStaticFiles restify и установите промежуточное ПО jwt для проверки статуса входа пользователя.

server.get(
  '/uploads/*', 
  jwtMiddleware,
  restify.plugins.serveStaticFiles('./images/upload')
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...