2014-11-30 13 views
7

Ho creato un'applicazione con Passport, Express 4 e Jade. Vorrei mostrare all'utente una barra di navigazione che cambia quando il log-inImpossibile accedere a req.user con Passport.js e Express 4

Tuttavia, non riesco ad accedere req.user per qualsiasi altra pagina rispetto alla pagina del profilo, che chiama isLoggedIn:.

function isLoggedIn(req, res, next) { 
    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) 
     return next() 

    // if they aren't redirect them to the home page 
    res.redirect("/login") 
} 

L'utilizzo di qualsiasi altra funzione per non reindirizzare l'utente quando non ha effettuato il login risulta in req.user essendo undefined. Ho l'utente in questo modo:

router.get("/profile", isLoggedIn, function(req, res) { 
    res.render("profile", { 
    title: 'Gebruikersprofiel van ' + req.user.firstname + " " + req.user.lastname, 
    user: req.user // get the user out of session and pass to template 
    }) 
}) 

E senza la chiamata a isLoggedIn (questo non funziona):

router.get("/", function(req, res) { 
    // serve index.html 
    res.render("index", { 
     title: 'Home', 
     user: req.user, 
     message: req.flash("message") 
    }) 
}) 

isLoggedIn è al di fuori module.exports = function(passport) { /* all routes */ }, il resto è (ovviamente) in esso.

Setup della app è la seguente:

var express = require("express"), 
    bodyParser = require("body-parser"), 
    mongodb = require("mongodb"), 
    mongoose = require("mongoose"), 
    uriUtil = require("mongodb-uri"), 
    morgan = require("morgan"), 
    cookieParser = require("cookie-parser"), 
    session = require("express-session"), 
    passport = require("passport"), 
    flash = require("connect-flash"), 
    ip = "okay", 
    port = process.env.PORT || 80 

require("./includes/passport")(passport) 
require("./includes/subject") 
require("./includes/user") 

var app = new express() 
app.disable("x-powered-by") 
app.use(bodyParser.json()) 
app.use(bodyParser.urlencoded({ 
    extended: true 
})) 

app.use(morgan("dev")); // log every request to the console 
app.use(cookieParser()); // read cookies (needed for auth) 

// required for passport 
app.use(session({ secret: "yep" })); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 


app.set("view engine", "jade") 
app.use(express.static(__dirname + "/views")) 

/** 
* CORS support. 
*/ 
//skipped 

//Database setup skipped 

/** 
* App setup 
*/ 
// make our db accessible to our router - globals 
app.use(function(req, res, next) { 
    req.db = db 
    next() 
}) 

var api = require("./routes/api")(passport), 
    web = require("./routes/web")(passport) 

// /api for api routes and/for web routes 
app.use("/api", api) 
app.use("/", web) 

//Error handling skipped 

// fire in the hole! 
app.listen(port, ip, function() { 
    console.log("Listening on port " + port) 
}) 

Ho provato varie cose, tra cui l'aggiunta di middleware in app.js per aggiungere l'utente a res.locals.user, ma nessuno ha funzionato per me, finora.

Cosa sto sbagliando?

Modifica: Non ho visto molte persone menzionarlo, ma sarebbe StormPath forse una soluzione migliore?

Modifica 2: Sto usando Stormpath per ora, ma sarei comunque felice di suggerire su come risolvere questo problema, se qualcuno ne ha.

Modifica 3: Ho ricevuto un numero di richieste per visualizzare le funzioni (de) serializeUser. Sono i seguenti:

// used to serialize the user for the session 
passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 

// used to deserialize the user 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 
+0

hai provato a chiamare 'require ("./ include/passaporto") (passaporto)' 'dopo app.use (passport.session());'? – mvuajua

+0

Ho appena provato questo, non ha funzionato. Quello che vedo è che l'utente non viene deserializzato, ogni pagina può accedere solo all'utente che ha effettuato il login da un reindirizzamento da quella pagina (quindi un login per pagina sembra funzionare, ma ovviamente non è come voglio che sia) . – DatBassie

risposta

Problemi correlati