передача JWT в заголовке - PullRequest
0 голосов
/ 06 мая 2018

Я создал проект в nodejs, чтобы проверить, как работает jwt. Я поставил аутентификацию на маршрут, который я могу проверить с почтальоном. Хотя я хочу, чтобы этот проверенный маршрут отображал страницу, если пользователь вошел в систему. Я использую handlebars.js для шаблонов. Может кто-нибудь помочь мне, как это сделать.

index.js (Маршрут)

var ctrlUsers = require('../controllers/users.controllers.js');
router
.route('/users/login')
.post(ctrlUsers.login);

app.use(ctrlUsers.authenticate);
.get(ctrlUsers.authenticate,ctrlUsers.showaddress);

module.exports = router

users.controller.js

module.exports.login = function(req, res) {
console.log('logging in user');
var username = req.body.username;
var password = req.body.password;
User.findOne({
username: username
})
.exec(function(err, user) {
if (err) {
  console.log(err);
  res.status(400).ender('error');
} 
 else {
  if (bcrypt.compareSync(password, user.password)) {
    console.log('User found', user);
    var token = jwt.sign({ username: user.username }, 's3cr3t', { expiresIn: 3600 });
    console.log("Token1" + token);
    res
    .status(200)
    .redirect('/');
  } else {
    res
    .status(401)
    .render('error');
  }
  }
  });
  };

  module.exports.showaddress = function(req, res) {
  res.render('index');
  console.log("I am in");
  console.log(req.user);
  }


 module.exports.authenticate = function(req, res, next) {
 var headerExists = req.headers.authorization;
 console.log(headerExists);
 if (headerExists) {
 var token = req.headers.authorization.split(' ')[1]; 
 jwt.verify(token, 's3cr3t', function(error, decoded) {
  if (error) {
    console.log(error);
    console.log("Token 2" + token);
    res.status(401).json('Unauthorized');
  } 
  else {
    req.user = decoded.username;
    console.log("Here");
    next();
  }
 });} else { console.log("Token 3" + token) res.status(403).json('No token provided'); } };

При проверке с Почтальоном это работает нормально. Я просто не уверен, как заставить его работать в браузере. Как будто он должен показывать мне страницу, когда я нажимаю "http://localhost:3000/users/showaddress" при входе в систему.

Может кто-нибудь, пожалуйста, помогите с этим.

1 Ответ

0 голосов
/ 06 мая 2018

Быстрый ответ: отправьте JWT с помощью cookie-файла вместо заголовка, и браузер выполнит эту работу за вас.

Обратите внимание, что это возможно только при наличии только веб-клиентов. Для поддержки собственных клиентов, в основном, вам необходимо либо отправить JWT в заголовке, либо позволить клиенту указать, хочет ли он его в заголовке или файле cookie. Родные клиенты плохо справляются с cookie-файлами.

Если вы хотите придерживаться заголовка, вам понадобится сетевой уровень в вашем клиентском (JavaScript) приложении, которое добавляет JWT в качестве заголовка к каждому исходящему запросу на сервер, который выдал JWT. (Обязательно храните JWT в безопасном хранилище на клиенте. Используя файлы cookie, вы также получаете это бесплатно.)

Вы, вероятно, все равно используете этот слой в зависимости от того, как ведет себя бэкэнд, когда истекает JWT. Обычная настройка заключается в том, что клиент должен определить, когда истек срок действия JWT (бэкэнд обычно отвечает 401), и (попытаться) снова выполнить вход в фоновом режиме.

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