Проверка подлинности с помощью JWT (NodeJS)

#javascript #node.js #express #jwt

#javascript #node.js #экспресс #jwt

Вопрос:

Я хочу защитить свои маршруты, добавив промежуточное программное обеспечение ‘checkAuth’. Это промежуточное программное обеспечение проверяет действительность токена jwt. Я использую экспресс-маршрутизатор.

Но я не понимаю, как это сделать.

Мое промежуточное программное обеспечение checkAuth :

 module.exports = (req, res, next) => {
    let token = req.headers.authorization.split(" ")[1];

    try {
        jwt.verify(token)
        console.log("ok")
    }catch (e) {
        res.status(403)
    }

    next();
}

  

Спасибо!

Комментарии:

1. console.log(e) что вы получаете в своем улове?

2. console.log (e) выдает мне «Неожиданный токен в JSON в позиции 17»

Ответ №1:

Предполагая, что вы используете jsonwebtoken, вам не хватает «секретной» строки.

Согласно документации, именно так вы и должны поступать.

  1. при создании токена:

     var jwt = require('jsonwebtoken');
    var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
      

    Вы также можете пропустить время истечения срока действия:

     jwt.sign({
      data: 'foobar'
    }, 'secret', { expiresIn: 60 * 60 });
      
  2. для проверки:

    Есть несколько способов, которыми вы могли бы это сделать. Но для проверки вам понадобится та же секретная строка, которую вы использовали для входа в систему. Также вам необходимо присвоить переменной jwt.verify или вызвать ее с обратным вызовом, чтобы получить доступ к декодированным данным, таким как идентификатор пользователя и так далее.

     // verify a token symmetric - synchronous
    var decoded = jwt.verify(token, 'shhhhh');
    console.log(decoded.foo) // bar
    
    // verify a token symmetric
    jwt.verify(token, 'shhhhh', function(err, decoded) {
      console.log(decoded.foo) // bar
    });
    
    // invalid token - synchronous
    try {
      var decoded = jwt.verify(token, 'wrong-secret');
    } catch(err) {
      // err
    }
    
    // invalid token
    jwt.verify(token, 'wrong-secret', function(err, decoded) {
      // err
      // decoded undefined
    });
      

Ответ №2:

Создайте новую функцию с именем «verifyToken»

Я предлагаю пообещать это. Таким образом, вы можете использовать его в async функции в сочетании с await

 function verifyToken(token){
  return new Promise((res, err) => {
    jwt.verify(token, "secret key", (err) => {
      if (err) rej(err)
      res(true)
    })
  })
}
  

Это основано на обещаниях. Теперь вы просто передаете свой токен функции, которую он преобразует в true или false:

 module.exports = async (req, res, next) => {
    let token = req.headers.authorization.split(" ")[1];
    try {
        await verifyToken(token);
        console.log("ok")
    }catch (e) {
        res.status(403)
    }

    next();
}
  

Комментарии:

1. Это тоже сработало, спасибо!