javascript - 使用 sailsjs Passport 身份验证本地策略既不会给出任何错误,也不会对用户进行身份验证

标签 javascript node.js authentication sails.js passport.js

我正在尝试在我的项目中实现 Passport 本地策略 blog 。 我已经在 config 中创建了 Passportjs 文件。

var passport = require('passport'),
  LocalStrategy = require('passport-local').Strategy;

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password'
  },
  function(username, password, done) {
    console.log("User Authenticating...." + username + 'and' + password);
    User.findOne({
      username: username
    }).exec(function(err, user) {
      if (err) {
        return done(err);
      }
      if (!user) {
        return done(null, false, {
          message: 'Unknown user ' + username
        });
      }
      if (user.password != password) {
        return done(null, false, {
          message: 'Invalid password'
        });
      }
      return done(null, user);
    });
  }
));

我已经按照建议更新了 httpjs

  middleware: {

    passportInit    : require('passport').initialize(),
    passportSession : require('passport').session(),

     order: [
            'startRequestTimer',
            'cookieParser',
            'session',
            'passportInit',     
            'passportSession', 
            'myRequestLogger',
            'bodyParser',
            'handleBodyParserError',
            'compress',
            'methodOverride',
            'poweredBy',
            'router',
            'www',
            'favicon',
            '404',
            '500'
          ]
     }

  /***************************************************************************
  *                                                                          *
  * The number of seconds to cache flat files on disk being served by        *
  * Express static middleware (by default, these files are in `.tmp/public`) *
  *                                                                          *
  * The HTTP static cache is only active in a 'production' environment,      *
  * since that's the only time Express will cache flat-files.                *
  *                                                                          *
  ***************************************************************************/

  // cache: 31557600000
};
现在,当我尝试从我的身份验证 Controller 调用本地策略时

login: function (req, res) {
    var user = req.body.user;

    // check user
    if (!user) {
      //send bad request
      return res.status(500).json({payload : {}, message : "Undefined user"});
    }

    var username = (user.username !== undefined)? user.username : false;
    var password = (user.password != undefined)? user.password : false;

    // Grab user fields.
    if (!username || !password) {
      //send bad request
      return res.status(400).json({payload : {}, message : "Invalid username or password"});
    }
    console.log("before authenticated");
    console.log("username="+username);
    console.log("password="+password);
    passport.authenticate('local', function(err, user, info) {
      console.log("User Authenticated");
      if (err) {
        console.log("error=errpr");
        return res.status(400).json({payload : {error: err}, message : info.message});
      }

      if (!user) {
        console.log("error=user");
        return res.status(400).json({payload : {error: err}, message : info.message});
      }
      console.log("User Authenticated2");
      _authTokenRequestCb(user,req,res);

    })(req,res);
  },

它从不验证 Paasportjs 中的用户和控制台日志语句。

console.log("User Authenticating...."+username+'and'+password);

也从未执行过。我也没有收到任何错误。 任何人都可以建议我哪里出错了。

更新:我在这个stack question中找到了“如果没有提供‘电子邮件’或‘密码’, Passport 就会自动失败。我想一些相关文件会很有用!” 但作为控制台日志语句给我用户名和密码(在寄存器 block 中

console.log("before authenticated");
console.log("username="+username);
console.log("password="+password);

所以我确信情况并非如此。 谢谢

最佳答案

您是否创建了一个策略文件来说明要验证哪些 Controller 操作? Passport 没有拒绝访问 Controller 的策略。为此,您必须创建另一个策略。

看看这个答案:Passport authentication not working in Sails JS application

如果这没有帮助,请告诉我。

关于javascript - 使用 sailsjs Passport 身份验证本地策略既不会给出任何错误,也不会对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28139894/

相关文章:

javascript - 如何通过 gulp 任务获取文件大小(以字节为单位)

Asp.Net MVC3 - FormsAuthentication,如何在浏览器关闭时使 cookie 过期?

javascript - 使用 Angular js 迭代数组并将值存储为对象的键和值

javascript - 如何调用 jquery 插件中的这个函数?

node.js - 当先前记录的崩溃发生时,Crashlytics 不会触发 onRegressed

authentication - LDAP授权

authentication - 当最终用户为站点添加书签时,如何处理 OAuth2 状态的重用?

javascript - 未经我同意输入类型图像提交表单

javascript - Kendo UI PanelBar 有条件展开

javascript - 强制 csv-write-stream 始终使用双引号(nodejs 和 electrojs)