我使用node.js, mongoose, express & passport
作为前端,使用.ejs
构建RESTful应用。我正在尝试用护照添加身份验证。使用当前代码,我可以注册新用户,但新用户不会保持登录状态,并且在创建用户后,我无法登录进行需要授权的活动。似乎没有持久的用户。我也在使用express-session
。
我搜索过类似的问题,但任何“修复”似乎都没有帮助。我在具有相同堆栈的类似应用程序中具有几乎相同的代码...主要区别在于资源的名称(例如,比赛而不是项目)
这将是我使用过护照的第三个应用程序,所以它不是100%新的,并且具有类似/相同的代码,它已经在我的本地安装上工作。在这种情况下,它工作正常,包括显示和隐藏我的.ejs
文件中的登录/注销按钮。
然后我重构了这些路线,现在我根本无法获得护照。
我已经比较了代码,将auth路由放回到app.js
文件中,尝试在登录时登录req.user,然后登录并且它将不再起作用......没有护照路径似乎发挥作用。
我已经从我的package.json
文件重新安装了节点模块,复制并放大了粘贴了以前工作文件中的护照设置,req.user
始终未定义,我无法注册新用户。
我基本上重新安装了所有的护照,没有删除auth文件和app.js行并重新启动......但我应该能够在不删除内容的情况下解决这个问题。
可悲的是,我没有在重构之前保存一个版本。 :(
在我之前运行良好的情况下重构路线文件之后,为什么会出现这种情况的任何建议?据我所知,我重构了重构之前的事情。
这是我的app.js
护照设置
//setup passport
app.use(require("express-session")({
secret: "Fig is the best puppy ever",
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use(function(req, res, next){
console.log("Current User: " + req.user)
res.locals.currentUser = req.user;
next();
});
和我的身份验证路线:
//Authentication Routes
//show signup form
app.get('/register', function(req,res){
res.render("register")
})
//user signup
app.post("/register", function(req,res){
//res.send("Signing you up")
console.log(req.body)
var newUser = new User({username: req.body.username})
User.register(newUser, req.body.password, function(err, user){
if(err) {
console.log(err);
return res.render('register')
} else {
passport.authenticate("local")(req,res, function(){
console.log("Created new user")
res.redirect("/projects")
})
}
})
})
//LOGIN ROUTES
//render login form
app.get("/login", function(req,res){
res.render("login")
})
app.post("/login", passport.authenticate("local",
{
successRedirect: "/projects",
failureRedirect: "/login"
}), function(req,res) {
// console.log("Logged in" +currentUser)
// res.redirect("/projects")
})
//Logout Routes
app.get("/logout", function(req,res) {
req.logout()
res.redirect("/projects")
})
答案 0 :(得分:1)
您似乎错过了req.login
对身份验证的调用。尝试将此添加到您的注册中间件中的else
。
passport.authenticate("local")(req, res, function() {
req.login(user, function(err) {
if (err) {
console.log(err);
res.redirect('/register');
} else {
res.redirect('/projects')
}
})
})
答案 1 :(得分:0)
OP解决方案。
通过重新排序我的路线要求和护照设置来解决。正确的顺序如下。
//setup passport
app.use(require("express-session")({
secret: "Fig is the best puppy ever",
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
//I MOVED THESE LINES TO BELOW THE PASSPORT SETUP
// Route setup
app.use("/users", userRoutes)
app.use(authRoutes)