#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, вам не хватает «секретной» строки.
Согласно документации, именно так вы и должны поступать.
-
при создании токена:
var jwt = require('jsonwebtoken'); var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
Вы также можете пропустить время истечения срока действия:
jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: 60 * 60 });
-
для проверки:
Есть несколько способов, которыми вы могли бы это сделать. Но для проверки вам понадобится та же секретная строка, которую вы использовали для входа в систему. Также вам необходимо присвоить переменной 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. Это тоже сработало, спасибо!