2012-09-04 10 views

Odpowiedz

17

Należy wprowadzić następujący kod w swojej aplikacji, obok konfiguracji strategii:

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

W ten sposób po wywołaniu funkcji done z uwierzytelnionego użytkownika, paszport dba przechowywania userId w pliku cookie. Zawsze, gdy chcesz uzyskać dostęp do userId, możesz go znaleźć w treści żądania. (w wyrażeniu req["user"]).

Możesz także rozwinąć funkcję serializeUser, jeśli chcesz przechowywać inne dane w sesji. Ja robię to w ten sposób:

passport.serializeUser(function(user, done) { 
    done(null, { 
     id: user["id"], 
     userName: user["userName"], 
     email: user["email"] 
    }); 
}); 

można znaleźć więcej tutaj: http://passportjs.org/docs/configure

+0

mam ten Już teraz mój kod - ale potrzebują dostępu do cookie na stronie klienta przy użyciu javascript - czy to możliwe? –

+1

Przykro mi, nie zrozumiałem tego z twojego pytania. Właśnie przeanalizowałem pliki cookie w mojej aplikacji node.js i nie widzę jednego zestawu przez passportjs. Connect po prostu ustawia plik cookie z identyfikatorem sesji. Pozostałe dane są przechowywane na serwerze. Uważam, że należy ręcznie ustawić plik cookie z żądanymi danymi, a następnie przeanalizować go za pomocą javascript na kliencie. (używając wyrażenia: [link] (http://expressjs.com/api.html#res.cookie)). – AnduA

+1

Rozwiązałem już problem samodzielnie ustawiając własne ciasteczko, ale dzięki za informacje! –

16

Dodaj do signin ścieżka

res.cookie('userid', user.id, { maxAge: 2592000000 }); // Expires in one month 

Dodaj do SignOut ścieżka

res.clearCookie('userid'); 
+0

Myślę, że chodzi o to, jak zintegrować to z paszportem, tak jak w przypadku zwrotów paszportowych i strategii, możemy nie mieć dostępu do req/res. – viji

1

Jeśli jesteś używając generatora angular-fullstack, tak zmodyfikowałem setUserCookie, aby uzyskać _id w pliku cookie użytkownika (który później mogę pobrać w AngularJS).

setUserCookie: function(req, res, next) { 
    if (req.user) { 
     req.user.userInfo['_id'] = req.user._id; 
     console.log('Cookie', req.user.userInfo); 
     // Splice in _id in cookie 
     var userObjWithID = { 
      "provider": req.user.userInfo.provider, 
      "role": req.user.userInfo.role, 
      "name": req.user.userInfo.name, 
      "_id": req.user._id 
     }; 
     res.cookie('user', JSON.stringify(userObjWithID)); 
    } 
    next(); 
} 
0

Alternatywnie można wykonać następujące czynności:

passport.serializeUser(User.serializeUser()); 

passport.deserializeUser(User.deserializeUser()); 
app.use((req, res, next) => { 
    res.locals.login = req.isAuthenticated(); 
    res.locals.thisUser = req.user; 
    next(); 
}); 
Powiązane problemy