我正在尝试使用AJAX在Express应用程序上使用Passport库调用登录验证。我使用这样的本地策略:
router.post('/login', function(req, res, next) { passport.authenticate('loginUsers', function(err, user, info) { if (err) { return next(err); } // if user is not found due to wrong username or password if (!user) { //return res.render('login', {}); res.json({detail: info}); }//(!user) //passport.js has a logIn user method req.logIn(user, function(err) { if (err) { return next(err); } return res.render('account', {}); }); //req.logIn })(req, res, next); });
问题是我不知道如何将变量传递给Passport,模仿bodyparser.json()功能,我试图做这样的事情:
$(document).ready(function() { $('form').submit(function() { $.ajax({ type:'POST', url:'/login', data: {username: $('#us').val(), password: $('#pass').val()}, success:function(result){ if(!result){ //$('form input[name="username"]').css("background-color", "red"); } }, error: function (xhr, ajaxOptions, thrownError) { console.log(xhr.status); console.log(thrownError); } }); return false; }); });
编辑-
我的策略:
passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); passport.use('loginUsers', new LocalStrategy( function(username, password, done) { users.findOne({email: username}, function(err, user) { if (err) { return done(err); } if (!user) { console.log('[+] DB: user/password failure'.red); return done(null, false, {error: ''}); }else if(!bcrypt.compareSync(password, user.hashed_password)){ console.log(("[+] Password error").red); return done(null, false, {error: ''}); }else if(user.verified === false){ console.log("[+] DB: user not verified"); return done(null, false, {error: ''}); }else{ console.log("[+] DB: user/password success".green); return done(null, user); } //else }); //findOne } ));
传递凭据错误仍然存在,即时消息:
对象{细节:对象}细节:Objectmessage:“缺少凭据” 原 :
有人可以指出我正确的方向吗?
这应该有效,未经测试,请告诉我是否有错别字。
基本上,您需要您的快速应用程序来侦听/ login上的POST请求,通过这种方式,您可以添加护照身份验证。
app.post('/login', function(req, res, next) { passport.authenticate('loginUsers', function(err, user, info) { if (err) { return next(err); } if (!user) { return res.render('account'); } req.logIn(user, function(err) { if (err) { return next(err); } return res.json({detail: info}); }); })(req, res, next); });
另外,在您的策略中,请确保字段名称正确,即:
passport.use('loginUsers',new LocalStrategy({ usernameField : 'username', passwordField : 'password', passReqToCallback : true },