我正在使用nodejs v8.7.0开发后端, 对于使用护照和本地护照的身份验证,我之前使用过这个,一切顺利,但现在我不知道是什么问题,这是我的代码:
我的策略:
var passport = require('passport')
var LocalStrategy = require('passport-local').Strategy
passport.use('local', new LocalStrategy({
usernameField: 'email'
},
function (email, password, done) {
User.findOne({
email: email,
is_admin: false
}, function (err, user) {
if (err) {
return done(err)
}
// Return if user not found in database
if (!user) {
return done(null, false, {
message: 'User not found'
})
}
// Return if password is wrong
if (!user.validPassword(password)) {
return done(null, false, {
message: 'Password is wrong'
})
}
// If credentials are correct, return the user object
return done(null, user)
})
}
))
这是电话会议的地方:
router.post('/login', (req, res) => {
try {
passport.authenticate('local', function (err, user, info) {
console.log('here xx')
var token;
if (err) {
console.log(err);
return res.status(401).json(err);
}
// If a user is found
if (user) {
console.log('here')
token = user.generateJwt();
return res.status(200).json({
"token": token
});
} else {
// If user is not found
res.status(401).json(info);
}
})
} catch (reason) {
res.status(501).json({
message: reason.message
})
}
})
问题是我得到的东西没有像来自console.log的消息或类似错误的东西,它没有执行来自passport.authenticate的回调....就像注册新用户和一切都运行良好的方式 有人可以帮忙吗?
答案 0 :(得分:8)
Passport应该用作middleware
。在您的路线中使用它:
router.post('/login', passport.authenticate('local'), (req, res) => { })
在您的路线中,您可以访问req.user
如果您不使用中间件,则可以使用回调。但您需要传递req
,res
和next
。
例如:
passport.authenticate('local', function (err, user, info) {
})(req, res, next)
这是一个完整的示例,请注意,这不是使用中间件,因为在这种情况下,您要定义自定义消息,并且需要使用回调来获取信息。
router.post('/login', (req, res) => {
passport.authenticate('local', function (err, user, info) {
if (err) {
return res.status(401).json(err);
}
if (user) {
const token = user.generateJwt();
return res.status(200).json({
"token": token
});
} else {
res.status(401).json(info);
}
})(req, res, next)
})
答案 1 :(得分:0)
当您使用 passport.authenticate
作为回调时,您的应用程序有责任建立会话(通过调用 req.login()
)并发送响应。
这里是 passport.js
文档的链接,可以提供帮助:
http://www.passportjs.org/docs/authenticate/