2016-07-19 2 views
0

У меня есть веб-сервер, который обслуживает веб-сайт для пользователей. Через этот сайт они могут войти в систему, используя oauth, который я сейчас храню в сеансе на сервере. Сеанс в основном просто говорит мне, что это за пользователь, и если они вошли или нет (это все, что я хочу от него).Аутентификация: сеансы, JWT или что-то еще?

У меня тогда есть API-сервер, который используется только для запроса информации, которая может быть защищена (т. Е. Только подписанные пользователи могут ее увидеть). API-сервер доступен только через главный сервер, который просто проксирует все. API-сервер имеет доступ к одному хранилищу резервных копий, что означает, что он может читать сеансы и обрабатывать запросы, требующие проверки подлинности. Примером такого подхода является то, что поскольку сеанс сохраняется только в памяти до сохранения, мне нужно сохранять его каждый раз, когда запрос будет проксирован на сервер, чтобы гарантировать, что API-сервер имеет свежие данные.

Но это не настоящая проблема. Истинная проблема заключается в том, когда пользователь посещает, говорит /account, я хочу предварительно собрать все данные, которые им нужны, и построить весь сайт на сервере, прежде чем отправлять их (чтобы у них не было дождаться http-запроса и снова отобразить весь сайт). Это проблематично, потому что, когда сервер пытается получить доступ к области, которую могут видеть только прошедшие проверку подлинности пользователи, ей становится отказано. Чтобы обойти это, мне нужно будет ввести идентификатор сеанса в запрос и переработать много кода, который интуитивно чувствует себя как неправильный подход. Если я использую JWT, я мог бы создать «суперпользовательский токен», который будет генерировать сервер, который позволит ему получить доступ к любой части аутентифицированной области, но это также становится рискованным.

Что вы, ребята, думаете?

Некоторая дополнительная информация, которая может иметь отношение:

  • Я использую реагировать и делать на стороне сервера визуализации
  • Я использую Redux (который является состояние Стараюсь предварительного заполнения)
  • Я используя Узел

Заранее благодарен!

ответ

0

Используйте промежуточное изделие перед контроллером в каждом безопасном маршруте/конечной точке. в этом промежуточном продукте проверьте ваш токен jwt, если токен действителен, а затем вызовите следующее промежуточное программное обеспечение.

router.route('/post') 
.post(isAdmin,postCntr.addPost); 



    function isAdmin (req, res, next) { 
    var token = req.headers['authentication'] || req.body.token || req.params.token; 
    if (token) { 
     // verifies secret and checks exp 
     jwt.verify(token, app.get('superSecret'), function(err, decoded) { 
      if (err) { 
       return res.json({ 
        err: err, 
        success: false, 
        message: 'Failed to authenticate token.' 
       }); 
      } else { 

       next(); 
      } 
     }); 

    } else { 

     // if there is no token 
     // return an error 
     return res.status(403).send({ 
      success: false, 
      message: 'No token provided.' 
     }); 
    } 
}