jQuery AJAX 调用 Express (nodejs) 框架上的 Passportjs 登录

标签 jquery ajax node.js express passport.js

我正在尝试使用 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
  }
));

传递凭据的错误仍然存​​在,我得到:

对象 {detail: Object}detail: Objectmessage: "Missing credentials"proto:

有人能指出我正确的方向吗?

最佳答案

这应该有效,未经测试,如果有拼写错误,请告诉我。

基本上,您需要您的 Express 应用程序来监听/login 上的 POST 请求,在此路由中,您可以添加您的 Passport 身份验证。

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
        },

关于jQuery AJAX 调用 Express (nodejs) 框架上的 Passportjs 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289963/

相关文章:

mysql - Node/Express/Sequelize : Datatype VIRTUAL gives SQL syntax error in db:migration

javascript - Node 大数据处理

javascript - JavaScript 中检测字符串是否不是 URL?

javascript - 如何分配不同的按钮以在 iframe 中加载不同的 URL?

javascript - 如何在向下滚动页面时添加CSS类

ajax - 使ajax onload和oncomplete失败

javascript - 避免重复的 dom 查询?

php - AJAX/PHP 自动显示更新值

c# - 如何将字符串化的 JSON 传递给 C# 方法?

javascript - 使用 React JS 搜索结果分页