2012-09-04 11 views
9

Sto utilizzando Passport.js per accedere alla mia Node-App. Ma nella mia app, ho bisogno di ottenere l'accesso all'ID dell'utente e al momento, non ho idea di come ottenere questa cosa!Come accedere al set di cookie con Passport.js

Come posso accedere all'ID utente o devo inviarlo io stesso in un cookie?

risposta

17

Si dovrebbe introdurre il seguente codice nel tuo app, accanto alla configurazione delle strategie:

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

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

In questo modo, quando si richiama la funzione done con l'utente autenticato, il passaporto si occupa di conservare la userId in un cookie. Ogni volta che si desidera accedere a userId lo si può trovare nel corpo della richiesta. (in espresso req["user"]).

È anche possibile sviluppare la funzione serializeUser se si desidera memorizzare altri dati nella sessione. Lo faccio in questo modo:

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

È possibile trovare maggiori qui: http://passportjs.org/docs/configure

+0

ho questo già mi mio codice - ma ho bisogno di accedere al cookie sul lato client, utilizzando JavaScript - è possibile? –

+1

Mi dispiace, non l'ho capito dalla tua domanda. Ho appena analizzato i cookie nella mia app node.js e non vedo un set di passportjs. Connect imposta semplicemente un cookie con sessionId. Il resto dei dati è memorizzato sul server. Credo che dovresti impostare manualmente un cookie con i dati desiderati e quindi analizzarlo utilizzando javascript sul client. (utilizzando express: [link] (http://expressjs.com/api.html#res.cookie)). – AnduA

+1

ho già risolto il problema impostando un proprio cookie ma grazie per le tue informazioni! –

16

Aggiungi al signin percorso

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

Aggiungi ai SignOut percorso

res.clearCookie('userid'); 
+0

Penso, la domanda è come integrare questo con il passaporto come nei callback del passaporto e nella strategia, potremmo non avere accesso a req/res. – viji

1

Se sei utilizzando il generatore angular-fullstack, ecco come ho modificato setUserCookie per ottenere il _id nel cookie utente (che in seguito posso recuperare in 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

In alternativa si potrebbe effettuare le seguenti operazioni:

passport.serializeUser(User.serializeUser()); 

passport.deserializeUser(User.deserializeUser()); 
app.use((req, res, next) => { 
    res.locals.login = req.isAuthenticated(); 
    res.locals.thisUser = req.user; 
    next(); 
}); 
Problemi correlati