Паспорт JWT работает с пустой полезной нагрузкой - PullRequest
0 голосов
/ 28 мая 2019

Я инициализировал стратегию для 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.log(error)
          done(error)},
        user => {
          console.log(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)
}

Но когда я передаю пустой или недействительный токен Паспорт, просто передайте этот

(payload, done) => {
  MySQL.Users.readOne(['id'], { id: payload.userId })
  .fork(
    error => {console.log(error)
      done(error)},
    user => {
      console.log(user)
      done(null, user)}
  )
}

шаг и код выполнения функции next().Можно ли как-то обнаружить, что полезная нагрузка недействительна или пуста?

1 Ответ

1 голос
/ 28 мая 2019

Я не совсем уверен насчет типа возврата вызова MySQL, но если ничто не соответствует идентификатору, это вызывает ошибку?

(payload, done) => {
  MySQL.Users.readOne(['id'], { id: payload.userId })
  .fork(
    error => {console.log(error)
      done(error)},
    user => {
      console.log(user)
      done(null, user)}
  )
}

Если это не вызывает ошибку, но возвращает нулевое или пустое значение, вам нужно проверить это в функции обратного вызова «success», потому что в этом случае она вызовет 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();
...