【问题标题】:Passport authenticate callback not being called未调用护照身份验证回调
【发布时间】:2020-02-23 04:43:39
【问题描述】:

我对 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)
  });

【问题讨论】:

    标签: node.js typescript passport.js passport-local


    【解决方案1】:

    我错过了我的代码所基于的示例的关键部分。我不得不使用passport.authenticate 作为中间件。因此,我使用passport.authenticate 生成一个函数,然后将reqresnext 传递给它,如下所示:

    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)
      });
    

    一切正常。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 2018-02-13
      • 2016-12-14
      • 2016-05-16
      • 2017-04-24
      • 2015-09-06
      • 2021-07-05
      • 2019-06-14
      • 2019-03-10
      相关资源
      最近更新 更多