如何在调用 passport.authenticate 作为中间件后隔离或修复无响应(浏览器挂起)

How to isolate or fix no-response (browser hang) after calling passport.authenticate as middleware

我正在尝试将 passport.authenticate('local') 用作 中间件 passport-local-mongoose 但它似乎没有将控制权传递给我路由中的后续中间件.

我假设有一个错误,但没有调用以下 (err, req, res, next) 中间件,所以我想知道我是否误解了 passport-local 的一些基本知识。

我花了几个小时尝试各种事情,在这里搜索,但我找不到进一步隔离我的问题的方法或更好地记录我的路线中控制出错的地方。

我已经 post 编辑了一个可重现的小例子 GitHub

这就是我在设置路线之前的设置方式:

// Get connected
mongoose.connect('mongodb://localhost/pass');
mongoose.Promise = global.Promise;
mongoose.connection.on('error', (err) => { console.error(err.message) });

// Basic user schema using nickname field as username
const Schema = mongoose.Schema;
const userSchema = new Schema({});
userSchema.plugin(passportLocalMongoose, { usernameField: 'nickname' });
const User = mongoose.model('User', userSchema);

// Initialise passport before routes
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser);
passport.deserializeUser(User.deserializeUser);
app.use(passport.initialize());

这是我 passport.authenticate:

的路线
app.post('/login',
    (req, res, next) => {
        console.log('login posted ok');
        next();
    },
    passport.authenticate('local'),
    (req, res) =>  res.send('login successful'),
    (err, req, res, next) => {
        console.log(err);
        res.send('login unsuccessful');
    }
);

还有其他有哈巴狗浏览量和注册的路线。

注册工作正常,在 mongo db.users.find() 中为新用户显示一个漂亮的条目。

但是我的 /login post 路线没有超过 passport.authenticate.

console.log 被触发,所以我知道正在调用路由。

基于我对快递和护照的有限了解,我希望触发以下两个中间件之一,一个成功,一个失败。

两者都没有触发。

最好的隔离方法在authenticatedocs的“自定义回调”下有讲到,只是我原来没看懂。

注意:我已将以下内容保存在我的回购协议的 answer 分支中,如问题中所述。

app.post('/login',
    (req, res, next) => {
        console.log('login posted ok');
        next();
    },
    (req, res, next) => {
        console.log('authenticating...')
        passport.authenticate('local', (err, user, info) => {
            console.log(req, res, err, user, info);
            next(err);
        }) (req, res, next);
    },
    (req, res) =>  res.send('login successful'),
    (err, req, res, next) => {
        console.log(err);
        res.send('login unsuccessful');
    }
);

我的感悟

  • passport 不将身份验证失败视为 err
  • 它只是留下 user null
  • 基本上你需要给它 successfailure 重定向如果你想使用中间件形式,不要做我所做的并尝试处理 err