2017-05-30 50 views
0

我正在使用express4在我的nodejs應用程序中使用passportjs。爲了測試目的,我使用session-file-store來保持會話。Passportjs的會話問題

我建立會話和passportjs方式:

this.app.use(session({ 
    secret: process.env.SESSION_SECRET || configuration.session_secret, 
    store: new fileStore(), 
    resave: false, 
    saveUninitialized: false 
})); 

// config authentication 
this.app.use(passport.initialize()); 
this.app.use(passport.session()); 
// Configure Passport 
passport.use('local-login', new localStrategy.Strategy(
    (username, password, done) => { 
     Services.users.authenticatePromise(username, password).then(
      function(token) { 
      done(null, token); 
      }, 
      function(err) { 
      done(null, false, err); 
      }, 
    ).done(); 
    }, 
)); 
    // Serialize user in session 
passport.serializeUser((token: AccessToken, done) => { 
    let user = { 
    _token: token.accessToken, 
    _expiryInAt: token.expiryInMs + new Date().getTime(), 
    }; 
    done(null, user); 
}); 

passport.deserializeUser((sessionUser, done) => { 
    done(null, sessionUser); 
}); 

不過,我遇到的問題是,如果我是登錄的用戶之前沒有寫任何東西到會話,passportjs工作正常。但是,如果我試圖將一些數據寫入會話中,例如購物車詳細信息,那麼Passportjs將無法將用戶令牌序列化到會話存儲中。所以登錄無法成功。

我錯過了什麼?

+0

你在做'req.session = {...}'或者類似的東西?即用新的東西覆蓋整個會話對象。 – robertklep

+0

不,我做了這樣的事情:'''if(!req.session ['basket']){ req.session ['basket'] = {}; }''' – rzhomx

+0

對不起,這不應該是問題,因爲它無法序列化。你能否將'passport.serializeUser/deserializeUser'的實現添加到你的問題中?另外,_「無法序列化」_是什麼意思? – robertklep

回答

0

你的代碼有兩個錯誤,我可以看到。

first,serializeUser應該接受一個對象並返回一個字符串(通常是一個唯一的id或數據庫鍵)。你的函數當前接受一個字符串並返回一個對象;這是倒退。

秒,deserializeUser應該帶一個字符串並返回一個用戶對象。你的函數當前需要一個對象並返回相同的對象。

最後,serializeUserdeserializeUser必須是相反的;意思是,護照可以撥打deserializeUser(serializeUser(user))並取回原來的用戶對象。

所以你會想是這樣的:

passport.serializeUser((user, done) => { 
    return user.id; 
}); 

passport.deserializeUser((id, done) => { 
    getUserFromDatabase({id: id}, function(err, user) { 
    if (err) { 
     done(err, null); // something went wrong; return error 
    } else if (!user) { 
     done(null, false); // no user found; return `false` 
    } else { 
     done(null, user); // return user 
    } 
    }); 
}); 

更多信息請看這裏:Understanding passport serialize deserialize

+0

你說得對。這不是最好的做法,但我認爲這不是我看到的問題的原因。首先,當我在登錄之前沒有寫入會話時,這個serializeUser/deserializeUser可以正常工作。它可以將用戶序列化到會話存儲並對其進行反序列化。我只是試圖使用api標記而不是用戶標識與passportjs,我可以採取更好的解決方案? – rzhomx