2015-12-23 116 views
0

我是新手,对整个用户进行身份验证,并尝试学习如何使用Passport的LocalStrategy将用户添加到Mongo数据库。Nodejs护照本地策略总是失败

我想跟随一个特定的教程,出于某种原因,事情不会计划。每当我提交注册表单时,策略总是失败(重定向到失败页面)。我有一种感觉,这与他请求的身体没有被传递有关(因为我放置在声明策略的日志未运行)。但是,目前的基础设施似乎很难重构。此代码是否可以重构,以便在将请求交给护照之前手动解析请求(例如,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> 
+0

在html窗体标记中尝试使用action =''/ routes/login/register“ –

+0

我测试过路由器配置了”非护照“路由,并且它工作正常。问题(尝试过你的解决方案,它没有工作) – user2795329

回答

0

从我可以在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); 
    }); 
} 
)); 

因此,尝试改变的方式护照。使用书面,并尝试你的运气。

+0

我不确定我是否误解了某些东西,但对我来说,这看起来是一样的,只是没有process.nextTick(),并且在需要时通过护照模块,我不确定要做什么改变。 – user2795329