Паспорт аутентификации обратного вызова не вызывается - PullRequest
0 голосов
/ 22 февраля 2020

У меня была проблема с методом Passport authenticate. Обратный вызов, предоставленный методу, не был вызван.

Код был следующим:

import { Router, Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import passport from 'passport';

// ... some stuff

router.post('/login',
  (req: Request, res: Response, next: NextFunction) => {
    passport.authenticate('local', { session: false }, (err, user, info) => {

      // not reaching this part

      if (err) {
        return next(err);
      }

      if (err || !user) {
        return res.status(400).json({
          message: info ? info.message : 'Login failed',
          user,
        });
      }

      req.login(user, { session: false }, loginErr => {
        if (loginErr) {
          res.send(loginErr);
        }

        const token = jwt.sign(user, secrets.secret);

        return res.json({ user, token });
      });

      return res.status(500).send('Shouldn\'t come here');
    });
  },
  (err: any, req: Request, res: Response, next: NextFunction) => {
    return res.status(err.status || 500).send(err.message)
  });

1 Ответ

0 голосов
/ 22 февраля 2020

Я пропустил важную часть примера, на котором основан мой код. Мне пришлось использовать passport.authenticate как middleware . Итак, я использовал passport.authenticate для генерации функции, а затем передал req, res и next ей так:

router.post('/login',
  (req: Request, res: Response, next: NextFunction) => {

    // vvv THIS VARIABLE
    const middleware = passport.authenticate('local', { session: false }, (err, user, info) => {
      if (err) {
        return next(err);
      }

      if (err || !user) {
        return res.status(400).json({
          message: info ? info.message : 'Login failed',
          user,
        });
      }

      req.login(user, { session: false }, loginErr => {
        if (loginErr) {
          res.send(loginErr);
        }

        const token = jwt.sign(user, secrets.secret);

        return res.json({ user, token });
      });

      return res.status(500).send('Shouldn\'t come here');
    });

   // vvv AND THIS FUNCTION CALL
    middleware(req, res, next);
  },
  (err: any, req: Request, res: Response, next: NextFunction) => {
    return res.status(err.status || 500).send(err.message)
  });

И все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...