未调用 Passport 身份验证回调
Passport authenticate callback not being called
我在使用 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)
});
我错过了我的代码所基于的示例的关键部分。我不得不使用 passport.authenticate
作为 中间件 。因此,我使用 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)
});
一切正常。
我在使用 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)
});
我错过了我的代码所基于的示例的关键部分。我不得不使用 passport.authenticate
作为 中间件 。因此,我使用 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)
});
一切正常。