当前位置: 首页 > 面试题库 >

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

孔皓
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我正在使用Nodejs和Express Js。另外,我将NowJS添加到Express Js中以进行一些实时处理。 在配置文件中,我有 然后使用以下命令运行该应用程序: 但是,文件(图像,css,js)似乎没有被缓存,它们总是作为新文件提供。 P / s:我刚刚在localhost上进行了测试,缓存似乎可以在localhost上运行,但是,当上传到服务器时,缓存不再起作用。 问题答案:

  • 本文向大家介绍Node.js的Express框架使用上手指南,包括了Node.js的Express框架使用上手指南的使用技巧和注意事项,需要的朋友参考一下 Express介绍 npm提供了大量的第三方模块,其中不乏许多Web框架,比如我们本章节要讲述的一个轻量级的Web框架 ——— Express。 Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如

  • Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性: 可以设置中间件来响应 HTTP 请求。 定义了路由表用于执行不同的 HTTP 请求动作。 可以通过向模

  • Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性: 可以设置中间件来响应 HTTP 请求。 定义了路由表用于执行不同的 HTTP 请求动作。 可以通过向模板传递参数来动态渲染 HTML 页面。

  • 我试图用和构建一个简单的应用程序。 Ive用express Generator生成我的应用程序的skel: 然后我编辑了package.json文件以包含socket.io: 在运行时,so socket.io正在初始化,但似乎没有io.sockets模块。 我运行查看该对象,我得到: 那么sockets方法在哪里呢?无处可去。但是你看,有一个套接字功能: 以防万一,我将发布我的,但我的代码似乎没

  • 问题内容: 我的API有ExpressJS路由,我想从NodeJS内调用它 在我的 ./routes/api.js 文件中 因此,如果我想从前端调用其所有查找内容,但是我需要从NodeJS脚本的另一个方面进行调用,而不必在第二个位置再次重新定义整个函数 我曾尝试从内部使用HTTP模块,但出现“ ECONNREFUSED”错误 我了解Express背后的想法是创建路线,但是如何在内部调用它们 问题答