【问题标题】:Nodejs Passport Local Strategy always failingNodejs Passport 本地策略总是失败
【发布时间】:2015-12-24 04:52:00
【问题描述】:

我对节点的整个用户身份验证不熟悉,我正在尝试学习如何使用 Passport 的 LocalStrategy 将用户添加到 Mongo 数据库。

我正在尝试遵循特定的教程,但由于某种原因,事情不会按计划进行。每当我提交注册表单时,策略总是失败(被重定向到失败页面)。我感觉这与未通过请求的主体有关(因为我放置在声明策略的位置的日志未运行)。然而,目前的基础设施似乎很难重构。是否可以重构此代码,以便可以在将请求交给护照之前手动解析请求(例如 request.body.* name *)?

除非问题完全不同,否则我不知道...

index.js:

// Use middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(expressSession({ secret: 'whatkindofgamedoyouthinkthisishey',
                    cookie: {maxAge:null},
                    resave: false,
                    saveUninitialized: false}));
require("./config/passport")(passport);
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

// Obtain application modules
var userModels = require("./schemas/user")(mongoose);
var loginPage = require("./routes/login")(passport, userModels);

// Initialize Routes
app.use("/", loginPage);

passport.js(应该想个更好的名字):

var LocalStrategy = require("passport-local").Strategy,
    User = require("../schemas/user");

module.exports = function (passport) {
     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("local-signup", new LocalStrategy({
        email: "email",
        password: "password",
        passReqToCallback: true
    },
    function (request, email, password, done) {
        console.log("message sent to sign up"); // log not running
        process.nextTick(function () {
            User.findOne({email: email}, function (err, user) {
                if (err) {
                    return done(err);
                }
                if (user) {
                    return done(null, false, request.flash("signupMessage", "That email is already taken"));
                } else {
                    var newUser = new User();
                    newUser.email = email;
                    newUser.password = password;

                    newUser.save(function (err) {
                        if (err) {
                            throw err;
                        } else {
                            return done(null, newUser);
                        }
                    });
                }
            });
        });
    }
));
};

login.js(正在导出的路由器)

router.post("/register", passport.authenticate("local-signup", {
    successRedirect: "/loggedIn",
    failureRedirect: "/connectFailed",
    failureFlash: false
}));

HTML 格式:

<form class="form-signin" action="/register" method="POST">
    <div class="logoContainer">
        <img src="images/LogoWithoutText.png" class="image image-responsive" id="loginImage">
    </div>
    <h2 class="form-signin-heading">Please sign in</h2>
    <label for="inputEmail" class="sr-only">Email address</label>
    <input type="email" id="inputEmail" class="form-control" name="email" placeholder="Email address" required autofocus>
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" name="password" placeholder="Password" required>

    <div class="checkbox">
        <label>
            <input type="checkbox" value="remember-me"> Remember me
        </label>
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>

【问题讨论】:

  • 尝试在 html 表单标签中使用 action=''/routes/login/register"。
  • 我已经测试了路由器配置了“非护照”路由,并且工作正常。所以这不是问题(尝试了您的解决方案,但没有奏效)。

标签: node.js authentication express passport.js


【解决方案1】:

从我在 passportjs.org/docs 中可以看到的内容来看,passport.use 似乎具有以下签名:

var passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy({
   email: "email",
   password: "password",
   passReqToCallback: true
},
function(req, email, password, done) {
 User.findOne({ username: username }, function(err, user) {
   if (err) { return done(err); }
   if (!user) {
    return done(null, false, { message: 'Incorrect username.' });
   }
   if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
   }
   return done(null, user);
  });
 }
));

所以,试着改变一下passport.use的写法,试试运气。

【讨论】:

  • 我不确定我是否误解了某些东西,但对我来说,这看起来是一样的,只是没有 process.nextTick(),并且我在需要模块时传递了护照。我不确定要进行哪些更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2014-04-10
  • 2017-01-15
  • 2023-04-05
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多