2012-09-04 40 views
9

Estoy usando Passport.js para acceder a mi aplicación de nodo. Pero en mi aplicación, necesito tener acceso a la identificación del usuario y, actualmente, ¡no tengo ni idea de cómo lograr esto!Cómo acceder a las cookies establecidas con Passport.js

¿Cómo puedo acceder a la identificación del usuario o debo enviarla yo mismo?

Respuesta

17

Debe introducir el siguiente código en su aplicación, junto a la configuración de las estrategias:

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

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

De esta manera, cuando se invoca la función done al usuario autenticado, el pasaporte se encarga de almacenar la userId en una cookie. Cuando quiera acceder al userId, puede encontrarlo en el cuerpo de la solicitud. (en el expreso req["user"]).

También puede desarrollar la función serializeUser si desea almacenar otros datos en la sesión. Lo hago de esta manera:

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

Puede encontrar más información aquí: http://passportjs.org/docs/configure

+0

tengo esto ya que mi código - pero necesito para acceder a la cookie en el lado del cliente, usando javascript - es esto posible? –

+1

Lo siento, no entendí eso de su pregunta. Acabo de analizar las cookies en mi aplicación node.js y no veo ninguna configurada por pasaportejs. Connect simplemente establece una cookie con el sessionId. El resto de la información se almacena en el servidor. Creo que debes establecer manualmente una cookie con los datos deseados y luego analizarla mediante javascript en el cliente. (usando express: [link] (http://expressjs.com/api.html#res.cookie)). – AnduA

+1

Ya he resuelto el problema configurando una cookie propia, ¡pero gracias por su información! –

16

Añadir a signin ruta

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

Añadir a SignOut ruta

res.clearCookie('userid'); 
+0

Creo que la pregunta es cómo integrar esto con el pasaporte, como en las devoluciones de pasaportes y en la estrategia, es posible que no tengamos acceso a req/res. – viji

1

Si eres usando el generador angular-fullstack, así es como modifiqué setUserCookie para obtener el _id en la cookie de usuario (que luego puedo recuperar en 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

alternativa usted puede hacer lo siguiente:

passport.serializeUser(User.serializeUser()); 

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