2015-11-08 3 views
5

Ich schaute zuerst auf persistent sessions with passport, mongodb and express, aber es half nicht oder ergab Sinn.Passport hält keine dauerhaften Login-Sitzungen

Ich versuche, dauerhafte Anmeldungen mit meinem website zu bekommen. Mein Serialisierungsprozess funktioniert nicht.

// Passport needs to be able to serialize and deserialize users to support persistent login sessions 
passport.serializeUser(function(user, done) { 
    console.log('serializing user:',user.username); 
    //return the unique id for the user 
    return done(null, user._id); 
}); 

//Desieralize user will call with the unique id provided by serializeuser 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     console.log('deserializing user:',user.username); 
     return done(err, user); 
    }); 
}); 

Die gesamte Passdatei finden Sie auf der GitHub.

Ich denke, das Problem ist, dass ich sofort deserialized, oder zumindest das ist, was die console.logs zeigen.

Oder es könnte mit meiner Sitzung sein:

app.use(session({ 
    secret: 'keyboard cat', 
    cookie : { 
     maxAge: 3600000 // see below 
    } 
})); 

Hier ist mein Benutzerschema:

var userSchema = new mongoose.Schema({ 
    username : String, 
    password : String, //Hash 
    created_at : {type: Date, default : Date.now} 
}); 

Danke für die Hilfe!

Antwort

2

Ihr Problem ist nicht im Reisepass oder Ihrem Backend. Es ist am vorderen Ende mit eckigen. Sie setzen nur $rootScope.authenticated, wenn der Benutzer eine Login-Aktion ausführt, aber Sie müssen bei jeder App-Initialisierung mit dem Server nachsehen, indem Sie Ihre API aufrufen, um zu sehen, ob der Benutzer sich bereits angemeldet hat.

Also, vielleicht, in routes/api.js eine router.route('/current_user') Route erstellen, die entweder null (oder irgendeine Art von Gastbenutzerobjekt) zurückgeben sollte oder es kehrt die zur Zeit in Benutzer-Informationen protokolliert, so dass Ihre Front Winkel Ende App, ob der Benutzer wissen ist eingeloggt oder nicht und hat einige Benutzerinformationen, mit denen man arbeiten kann. Wenn /api/current_user einen Benutzer bereitstellt, wissen Sie, dass Sie angemeldet sind, und Sie können $rootScope.authenticated = true festlegen.

+0

Entschuldigung, ich habe diese Antwort gerade gesehen. Ich sehe es mir an! Das scheint die Lösung zu sein – Manu

3

Der Link, den Sie erwähnten, persistent sessions with passport, mongodb and express, spricht von einer alten Version des Express-Rahmen, die, die Sie bei der Verwendung sind Ihre package.json, https://github.com/manu354/teecher/blob/master/package.json ist "express": "~4.13.1", sehr neu.

Sie müssen diese Zeilen bewegen:

app.use(passport.initialize()); 
app.use(passport.session()); 

oben etwas zu sein, unmittelbar unter den app.use(session({...})

würde ich empfehlen, dass Sie diese Blog-Post folgen, http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/, es wird definitiv helfen

+0

Das repariert es nicht. – Manu

0

Einfach posten, falls es jemandem hilft.

Überprüfen Sie, ob Ihr Client/Browser den Header Set-Cookie ausführt.

In meinem Fall funktionierte es gut in Safari, aber nicht in Chrome oder Firefox. Offensichtlich ein Problem auf der Client-Seite, da kein Browser serverseitigen Code identifizierte. Einer der Unterschiede zwischen Safari und Chrome/Firefox war, dass fetch Polyfill in Safari verwendet wurde, während Chrome und Firefox es nativ unterstützten. fetch verwendet nicht den Header Set-Cookie, es sei denn, Sie geben credentials in seinen Optionen an.