2014-11-30 5 views
7

Ich habe eine App mit Passport, Express 4 und Jade erstellt. Ich möchte dem Benutzer eine navbar zeigen, dass sich ändert, wenn sie sich anmeldenZugriff auf req.user mit Passport.js und Express 4 nicht möglich

Allerdings kann ich nicht zugreifen req.user für jede andere Seite als die Profilseite, die isLoggedIn nennt.

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") 
} 

Mit jeder andere Funktion, um den Benutzer nicht umzuleiten, wenn nicht eingeloggt ist, ergibt req.user undefined. Ich erhalte der Anwender wie folgt aus:

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 
    }) 
}) 

Und ohne den Aufruf isLoggedIn (das funktioniert nicht):

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

isLoggedIn außerhalb module.exports = function(passport) { /* all routes */ } ist, der Rest ist (natürlich) darin.

Aufbau der App ist wie folgt:

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) 
}) 

habe ich verschiedene Dinge ausprobiert, einschließlich dem Hinzufügen von Middleware in app.js die Benutzer zu res.locals.user hinzufügen, aber keine hat für mich gearbeitet, bisher.

Was mache ich falsch?

Bearbeiten: Ich habe nicht viele Leute gesehen, die es erwähnen, aber wäre StormPath vielleicht eine bessere Lösung?

Bearbeiten 2: Ich benutze Stormpath für jetzt, würde aber immer noch gerne Vorschläge zur Lösung dieser, wenn jemand hat.

Edit 3: Ich habe eine Reihe von Anfragen erhalten, die (de) serializeUser Funktionen zu sehen. Sie sind wie folgt:

// 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

haben Sie versucht, ruft 'require ("./ includes/Pass") (Pass)' 'nach app.use (passport.session());'? – mvuajua

+0

Ich habe es gerade versucht, es hat nicht funktioniert. Was ich sehe, ist, dass der Benutzer nicht deserialisiert wird, jede Seite kann nur auf den Benutzer zugreifen, der sich von einer Weiterleitung über diese Seite angemeldet hat (so scheint ein Login pro Seite zu funktionieren, ist aber natürlich nicht so, wie ich es möchte) . – DatBassie

Antwort

Verwandte Themen