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);
});
});
haben Sie versucht, ruft 'require ("./ includes/Pass") (Pass)' 'nach app.use (passport.session());'? – mvuajua
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