Може да имате някои маршрути, които искате да защитите или да показвате информация въз основа на информацията за акаунта на даден потребител. Един лесен начин за ограничаване на достъпа в бекенда с Node и Express е използването на JSON уеб токени. В по-късен урок ще демонстрирам как това може да се пренесе към предния край в рамки като AngularJS, за да се получи конкретна информация за този токен (идентификационни данни на потребител, информация за база данни и т.н.).

Има много NPM модули, които обработват JSON уеб токени и много от тях работят добре. В този урок обаче ще използваме „jsonwebtokens“. Просто стартирайте „npm install jsonwebtokens“ в директорията на вашия проект и го изискайте в желаната от вас страница, както следва:

var User = require('./userModel');
var jwt = require('jsonwebtokens');
var newUser = function (req, res){
  User.findOne({where:{ username: req.body.username }})
    .then(function (user) {
      if(!user){
        User.create({ 
          username: req.body.username, 
          password: req.body.password, 
          email: req.body.email 
        })
        .then(function(user){
              var myToken = jwt.sign({ user: user.id },
                                      'secret',
                                     { expiresIn: 24 * 60 * 60 });
              res.send(200, {'token': myToken,
                             'userId':    user.id,
                             'username': user.username });
        });
      } else {
        res.status(404).json('Username already exist!');
      }
    })
    .catch(function (err) {
      res.send('Error creating user: ', err.message);
    });
};

В този пример той показва вашата основна функция за регистрация на нов потребител, нещо, което може да намерите на страница на userController в задната част на проект Node с ORM. Тази част от кода е от проект, върху който работих преди няколко месеца, а потребителският модел е екземпляр на Sequelize, MySQL ORM.

Както можете да видите, ако потребителят не съществува, той се създава. Малко след като декларираме променлива, наречена „myToken“, която съхранява много специфичния токен, включително „сигурната“ информация в първия параметър, таен низ (който може да бъде всичко) във втория параметър и незадължителен обект, който приема параметри като изтичане на токена в третия параметър.

След като токенът е подписан, ние изпращаме токена като свойство в обекта за отговор, който се изпраща към страната на клиента. В бъдещ урок ще демонстрирам как често се справям с това с AngularJS.

Проверка на JSON уеб токени

var authorize = function(req, res, next) {
 var token = req.body.token || req.headers[‘x-access-token’];
  if (token) {
   jwt.verify(token, 'secret', function(err, decoded) {
      if (err) {
         console.error(‘JWT Verification Error’, err);
         return res.status(403).send(err);
      } else {
         req.decoded = decoded;
         return next();
      }
   });
  } else {
   res.status(403).send(‘Token not provided’);
   }
}

В този пример това е доста проста реализация на мидълуерна функция, която може да се използва, преди да се разреши достъп до друг маршрут.

Този път все още използваме jwt, но вместо да подписваме токените, използваме вграден метод, наречен „проверка“, който проверява дали предаваният токен съответства на тайната (която може да бъде всичко). Ако това стане, тогава функцията за обратно извикване връща променлива, в нашия случай „декодирана“, която ще оцени или като вярна, или като фалшива.

От страна на клиента, за да може междинният софтуер да разбере дали даден маршрут е удостоверен, трябва ръчно да зададете заглавките.

headers[‘x-access-token’] = [jwt-token]

Сигурно ли е? да Тъй като JWT е криптиран и тайната не се предава на предния край. Прочетете повече тук: https://github.com/auth0/jwt-decode/issues/4