【问题标题】:Nodejs Passport authenticate callback not being called with no errorsNodejs Passport 身份验证回调未被调用且没有错误
【发布时间】:2014-09-01 12:18:52
【问题描述】:

我见过与我类似的问题,但我找不到正确的答案。

我正在尝试使用 nodejs+express+passport(本地策略)实现一个非常简单的登录表单。问题是,我的身份验证回调似乎总是失败。我已经删除了与测试数据库的每个连接(每个教程都有一个示例 MongoDB)。

这是我的登录表单

<html>
  <body>
    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username" />
        <br/>
      </div>
      <div>
        <label>Password:</label>
        <input type="password" name="password" />
      </div>
      <div>
        <input type="submit" value="Submit" />
      </div>
    </form>
  </body>
</html>

这是我的 server.js(我使用 npm start 运行它)

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

var app     = express();
var port    =   process.env.PORT || 8080;

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(function(username, password, done) {
        // no authentication logic here... just return done with an object with 2 fields
        return (done, {username : username, password : password});
}));

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

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

// ROUTES
// ==============================================

// sample route with a route the way we're used to seeing it

app.post('/login',
                passport.authenticate('local', {
                successRedirect: '/loginSuccess',
                failureRedirect: '/loginFailure'
                })
);

app.get('/login', function(req, res) {
  res.sendfile('views/login.html');
});

app.get('/loginFailure', function(req, res, next) {
  res.send('Failed to authenticate');
});

app.get('/loginSuccess', function(req, res, next) {
  res.send('Successfully authenticated');
});

// START THE SERVER
// ==============================================
app.listen(port);

console.log('Magic happens on port ' + port);

我总是收到 Failed to authenticate 消息。就像我说的,我已经用 mongoose 剥离了与模式/模型相关的所有代码,以从示例 MongoDB 中读取数据。 passport.authenticate 回调只返回带有 2 个字段的对象的 done 函数,称为 username 和 password ,就像 passport-local 所期望的那样

你能帮帮我吗?

【问题讨论】:

    标签: node.js express passport.js passport-local


    【解决方案1】:

    我不相信您正确调用回调: 第一个参数期望错误或 null,第二个参数期望 false 或用户对象。

    passport.use(new LocalStrategy(function(username, password, done) {
        // no authentication logic here... just return done with an object with 2 fields
        done(null, {username : username, password : password}); 
    }));
    

    或者,使用数据库:

    passport.use(new LocalStrategy(function(username, password, done) {
        db.users.findOne({ username : username}, function(err, user){
           if(err) return done(err);
           if(!user || user.password !== password) return done(null, false); 
           done(null, user);
        });
    });
    

    在这里您可以看到我们在响应用户对象之前比较密码,然后通过护照库将其附加到 req.user。当然,您不会比较两个密码,而是使用 bcrypt 或类似方法比较它们的哈希值。

    【讨论】:

    • 我很困惑。我读过的每个教程都从通过猫鼬(findOne 方法)完成的查询创建一个用户对象。唯一的要求是生成的对象有两个字段:用户名和密码。例如,如果 db 上的字段称为 email,我可以使用正确的语法覆盖 usernameField。所以我创建了有史以来最简单的对象:2 个属性,用户名和密码。 done 方法的第一个参数为 null,第二个参数为 user 对象。
    • @user3757063,我不确定我是否理解您的问题。你能改写一下吗?如果您想使用电子邮件而不是用户名,那么您必须在上面的 app.post 中发送 { usernameField : "email" } 的选项。
    猜你喜欢
    • 2014-03-18
    • 2016-08-10
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2018-07-25
    • 2018-09-21
    相关资源
    最近更新 更多