2015-11-08 69 views
5

我首先看了persistent sessions with passport, mongodb and express,但它沒有幫助或沒有意義。護照沒有保持永久登錄會話

我試圖持續登錄我的website。我的序列化過程不起作用。

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

整個護照文件可以在github上找到。

我認爲問題是我立即得到反序列化,或至少是console.logs顯示。

或者它可能是與我的會議:

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

這裏是我的用戶模式:

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

感謝您的幫助!

回答

2

您的問題不在護照或您的後端。它的前端有棱角。當用戶採取登錄操作時,您只設置$rootScope.authenticated,但您需要在每次初始化應用程序時通過調用您的api來檢查服務器是否已經登錄。

也許,在routes/api.js創建router.route('/current_user')路線應該要麼返回null(或某些類型的guest用戶對象),或者它會返回當前登錄的用戶的信息,以便您的前端角應用程序將知道用戶是否已登錄或沒有,並有一些用戶信息可以使用。如果/api/current_user提供了一個用戶,那麼你知道你已經登錄,你可以設置$rootScope.authenticated = true

+0

對不起,我剛纔看到了這個答案。我會看一看!這看起來像是修復 – Manu

3

你提到,persistent sessions with passport, mongodb and express鏈接,在談論一個老版本的快遞框架,您使用的是一個在你的package.jsonhttps://github.com/manu354/teecher/blob/master/package.json"express": "~4.13.1",很新。

您需要將這些行:

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

上面一點點,立刻成爲app.use(session({...})

下,我建議你遵循這個博客帖子,http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/,它一定會幫助你

+0

這不能解決它。 – Manu

0

只是發佈,以防萬一它幫助任何人。

檢查您的客戶端/瀏覽器是否正在執行Set-Cookie標頭。

在我的情況下,它在Safari中工作正常,但在Chrome或Firefox中無法正常工作。很明顯,客戶端問題是因爲沒有瀏覽器識別服務器端代碼。 Safari和Chrome/Firefox之間的區別之一是在Safari中使用了fetch填充,而Chrome和Firefox本身支持。 fetch不使用Set-Cookie標題,除非您在其選項中提供credentials