Защита маршрутов на Express и NodeJs

Я ищу лучший способ "ограничить" конкретные маршруты, я собираюсь объяснить это на примере:

У меня есть два пользователя:

-user1 id: 123

-user2 id: 456

Сторона клиента (угловая):

//LOGGED AS USER 123
$http.post('www.domain.com/api/user/123')
.then(function (data) {
  // here I should receive the data from user 123
})

Приведенный выше код легко сделать, но я хочу ограничить эту конечную точку (со стороны сервера) только для пользователя 123. Если пользователь 456 попытается получить эту конечную точку, его ударили. Пример:

//LOGGED AS USER 456
$http.post('www.domain.com/api/user/123')
.then(function (data) {
  // should return error (forbidden resource)
})

Как вы можете видеть, если вы вошли как пользователь 456, вы можете получить данные из "api/user/123", но вы можете получить из "api/user/456"

Я хочу решить это со стороны сервера

ВОПРОС:

Каков наилучший способ сделать это с Node/Express/JWT??

0 ответов

Я бы использовал другой дизайн URL. Вместо того, чтобы иметь

www.domain.com/api/user/123

Я бы просто

www.domain.com/api/user

И найдите идентификатор пользователя из токена аутентификации или идентификатора сеанса, отправленного с запросом.

Я видел много ошибок авторизации / безопасности, связанных с указанием идентификаторов в URL. Если подумать, то это, по сути, дублирует параметр ID пользователя, поскольку он появляется один раз в URL и один раз в токене аутентификации. Такое дублирование часто приводит к проблемам с синхронизацией логики авторизации с самим собой.

Создать middleware/authorize.js

const fs = require('fs');
const jwt = require('jsonwebtoken');

module.exports = (req, res, next) => {
    console.log('in!');
    let key = fs.readFileSync('rsa_2048_pub.pem');
    // If you are using default HMAC key the line above would be something like this:        
    // let key = process.env.JWT_SECRET // nodemon.json file needed for this to work

    try{
        const token = req.headers.authorization.split(' ')[1]; //req.headers.token;
        console.log(token);
        var decoded = jwt.verify(token, key)
        console.log(decoded);

        // add validation code here...

        next();

    }catch(err){
      return res.status(401).json({error: err, message: 'Invalid token.'});
    }
};

В route /users.js вы импортируете свое промежуточное ПО и получите что-то вроде этого:

const User = require('../models/user')
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const authorize = require('../middleware/authorize'); //import your middleware

// add your middleware call to your routes
router.route('/validate-token').get(authorize, function(req,res, next){
  console.log('out!');

  res.status(200).json({message: 'Valid token.'});
});

Вы можете использовать свою полезную нагрузку для хранения информации, такой как userId, admin : true/false авторизовать доступ в вашем промежуточном программном обеспечении.

Для более полной обработки авторизации я рекомендую также использовать пакет авторизации, такой как CASL, вместе со стратегией JWT.

Другие вопросы по тегам