Я инициализировал стратегию для JWT:
const jwtStrategyOptions = {
jwtFromRequest: ExtractJwt.fromHeader('x-access-token'),
secretOrKey: 'publicKey',
}
passport.use(
new JwtStrategy(
jwtStrategyOptions,
(payload, done) => {
MySQL.Users.readOne(['id'], { id: payload.userId })
.fork(
error => {console.info(error)
done(error)},
user => {
console.info(user)
done(null, user)}
)
}
)
)
И промежуточное ПО:
const isAuthenticated: RequestHandler = (req, res, next) => {
passport.authenticate(
'jwt',
{ session: false, failWithError: true },
(error, user) => {
//error is null when I pass empty payload
if (error) {
return next(error)
}
req.user = user
return next()
}
)(req, res, next)
}
Но когда я передаю пустой или недействительный токен Passport, просто передайте это
(payload, done) => {
MySQL.Users.readOne(['id'], { id: payload.userId })
.fork(
error => {console.info(error)
done(error)},
user => {
console.info(user)
done(null, user)}
)
}
шаг и код выполняют функцию next()
.
Могу ли я как-то определить, что полезная нагрузка недействительна или пуста?
Я не совсем уверен в типе возврата вызова MySQL, но если ничего не соответствует идентификатору, возникает ли ошибка?
(payload, done) => {
MySQL.Users.readOne(['id'], { id: payload.userId })
.fork(
error => {console.info(error)
done(error)},
user => {
console.info(user)
done(null, user)}
)
}
Если он не выдает ошибку, а возвращает нулевое или пустое значение, вам нужно проверить это в функции обратного вызова «успех», потому что в этом случае он вызовет done(null, user)
с пустым значением.
Основываясь на вашем комментарии, это может помочь, некоторый код, который я использовал для проверки ошибки истечения срока действия токена:
passport.authenticate('jwt',
{session: false},
//we need this callback to return information on why it's failing
//err is not populated, but 'info' is...
(err, user, info) => {
if (err) {
return next(err);
}
//if we couldn't authenticate the user, check why
//401 is used when no token or random information is provided
//403 is used when a well-formed token is provided, but it has expired thus not valid anymore
if (!user) {
if (info.name === 'TokenExpiredError') {
return res.status(403).send(info.name);
}
else {
return res.status(401).send(info.message);
}
}
req.user = user;
return next();
Хорошо, я вижу, я обновил свой ответ. Надеюсь поможет :D
я немного запутался, почему ошибка не заполняется, когда есть TokenExpiredError? Разве это не следует считать ошибкой? В настоящее время я пытаюсь перехватить, истек ли срок действия токена, а ошибка всегда пуста, но информация говорит, что что-то имеет ошибку, как и в вашем коде.
@ The.Wolfgang.Grimmer Я думаю, что объект err
используется, когда в функции аутентификации есть фактическая ошибка, а info
представляет собой подробную информацию о данных токена. Токен с истекшим сроком действия по-прежнему является «действительным» токеном с точки зрения синтаксического анализа и т. д.
@ HRK44 да, но это немного неинтуитивно. Было бы лучше, если бы ошибки, выдаваемые пакетом jsonwebtoken под капотом, отлавливались
Когда я передаю действительный токен, все работает нормально, и я получаю пользователя из БД, но когда я передаю недействительный или пустой токен, он просто пропускает функцию обратного вызова с выбором БД и ошибка в методе паспорта.