我正在尝试用passport.js实现登录端点。我的用户模式包含昵称和密码。到目前为止,在app.js中我有:
require('./config/passport');
app.use('/user', passport.authenticate('jwt', {session: false}), require('./routes/user/login.js'));
我需要我的文件passport.js,其中有passport策略配置:
passport.use(new LocalStrategy({ usernameField: 'nickname' }, (nickname, password, done) => {
User.findOne({ nickname: nickname })
.then(user => {
if(!user) {
return done(null, false, { message: 'Email and/or password is not valid' });
}
bcrypt.compare(password, user.password, (err, isMatch) => {
if(err) throw err;
if(isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Email and/or password is not valid' });
}
});
});
})
);
passport.use(new JWTStrategy({
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
secretOrKey: keys.secretJWT
},
function (jwtPayload, cb) {
return User.findOneById(jwtPayload.id)
.then(user => {
return cb(null, user);
})
.catch(err => {
return cb(err);
});
})
);
在/user
上的app.js (第一个代码片段)中,我需要实际的端点,即:
router.post('/login', function (req, res, next) {
passport.authenticate('local', {session: false}, (err, user, info) => {
console.log(info);
if (err || !user) {
return res.status(400).json({
message: 'Email and/or password is not valid',
user: user
});
}
req.login(user, {session: false}, (err) => {
if (err) next(err);
//generate a signed JWT with the contents of user object and return it in the response
const token = jwt.sign(user, keys.secretJWT);
return res.json({user, token});
});
})(req, res);
});
所以最后它会在调用/user/login
时被调用。对我来说奇怪的是console.log(info);
从来没有真正的控制台,我不能在我的节点应用程序运行的终端中看到它。
我正在传递有效的昵称和密码,但我总是得到401未经授权:
我遗漏了什么?也许是因为我没有传递token?但在登录时,我不知道令牌。它应该是对登录的响应。然后,我将在进一步的请求中使用令牌进行身份验证。
发布于 2019-06-14 03:15:52
我认为您在passport.use()函数中遗漏了策略别名。在路由器中使用别名jwt
:passport.authenticate('jwt', {session: false})
因此,您的passport.use()函数应该如下所示:
passport.use('local', new LocalStrategy(...), function(payload, cb){...})
passport.use('jwt', new JWTStrategy(...), function(payload, cb){...})
否则,您无法将适当的策略与别名相匹配。此外,在登录控制器中,在这种情况下,您必须使用“本地”别名调用passport。
https://stackoverflow.com/questions/56580889
复制相似问题