2012-06-25 26 views
17

Estoy usando pssportjs con express 2.x y un almacenamiento de sesiones. Después de un inicio de sesión, recibo una solicitud de usuario solo una vez. Tan pronto como redireccione de nuevo req.El usuario no está definido.PassportJS: Cómo obtener req.user en mis vistas

Aquí es mi config:

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

passport.deserializeUser(function(userId, done) { 
    User.findOne({_id: userId} ,function(err, user){ 
    done(err, user); 
    }); 
}); 

// Authentication Strategy 
passport.use(new FacebookStrategy({ 
    clientID: CONFIG.fb.appId, 
    clientSecret: CONFIG.fb.appSecret, 
    callbackURL: CONFIG.fb.callbackURL 
    }, 
    function(accessToken, refreshToken, profile, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     User.findOne({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) { 

      if(olduser) { 
      done(null, olduser); 
      } else { 
      var newuser  = new User(); 
      var account  = {provider: "facebook", uid: profile.id}; 
      newuser.accounts.push(account); 
      newuser.firstname = profile.name.givenName; 
      newuser.lastname = profile.name.familyName; 
      newuser.email  = "TBD..."; 

      newuser.save(function(err) { 
       if(err) { throw err; } 
       done(null, newuser); 
      }); 
      } 
     }); 
    }); 
    } 
)); 

var app = module.exports = express.createServer(); 

// configure express 
app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.compiler({ src : __dirname + '/public', enable: ['less']})); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 

    //app.use(express.session({ secret: "keyboard cat" })); 
    app.use(express.session({ 
    secret: "victory cat", 
    store: new MongoStore({ 
     url: CONFIG.dbMongo.url 
     }) 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

Estos son mis rutas:

app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_status', 'user_photos'] })); 

app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/index', failureRedirect: '/' })); 

app.get('/index', function(req, res) { 

      res.render('index.ejs', { 
       siteTitle: "Welcome", 
       siteUrl: CONFIG.server.siteUrl, 
       user: req.user 
      }); 
}); 

Y finalmente esta es la forma en que estoy tratando de acceder al objeto de usuario en mi opinión:

<div class="page-header"> 
    <h3><%= siteTitle %></h3> 
</div> 

<% if (!user) { %> 
    <p>Not logged in !</p> 
<% } else { %> 
    <p>Hello, <%= user.firstname %> <%= user.lastname %>.</p> 
<% } %> 

Después de autenticar con Facebook mi vista muestra el nombre y el apellido correctamente. Después de otra solicitud de página, el usuario está indefinido (no se está solicitando la deserialización).

¿Qué estoy haciendo mal?

+2

Niza cuestión. Ayudó mucho :) –

+0

Es tonto que esto haya ayudado más que la documentación "oficial", los desarrolladores realmente deberían tomar más tiempo para explicar su trabajo. –

Respuesta

10

Utilice ayudantes dinámicos. He aquí un ejemplo de mi barebones user objeto:

app.dynamicHelpers({ 
    user: function(req, res){ 
     var roles, name; 

     if (req.session && req.session.auth == true) { 
      roles = ['member']; 
      name = (req.session.user) ? req.session.user.name : 'Registered member'; 
      id = (req.session.user) ? req.session.user.id : 0; 
     } 
     else { 
      roles = ['guest']; 
      name = 'Guest'; 
      id = null; 
     } 

     return { 
      name: name, 
      id: id, 
      roles: roles, 
      isGuest: roles.indexOf('guest') !== -1, 
      isAdmin: roles.indexOf('admin') !== -1 
     } 
    } 
}); 

Luego, desde puntos de vista simplemente puede utilizar #{user.name} o if user.isAdmin etc. como objeto user Ahora se puede acceder a otras partes de la aplicación.

Puede agregarlo a app.js o solicitarlo desde un archivo externo. Guardo todos mis ayudantes dinámicos en /utils/helpers.js

2

¿Has configurado el middleware pasaporte? Desde el document, lo que necesita hacer

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ secret: 'keyboard cat' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(YOUR_STATIC_DIR_PATH)); 
}); 

si está utilizando 3.x Express o Conectar 2.x, set cookie secret instead of session secret

app.configure(function() { 
    app.use(express.cookieParser('keyboard cat')); 
    app.use(express.session()); 
    app.use(express.bodyParser()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(YOUR_STATIC_DIR_PATH)); 
}); 
+0

Estoy usando Express 2.x y lo he configurado exactamente así (pero con una tienda de sesiones mongo). Voy a actualizar mi pregunta. ¿Debo actualizar para expresar 3.x? – Sven

+0

No estoy seguro de qué versión es mejor. Creo que usar la última versión es interesante y educativo ya que puedo ver cómo TJ está mejorando la implementación en tiempo real. – smagch

2

bien lo tengo:

El error que no estaba en el código que publiqué arriba, que es correcto. Tenía una forma incorrecta de vincularme a las URL, así que de alguna manera forcé a Express a crear una nueva sesión cada vez que usaba uno de los enlaces rotos. Con la nueva sesión también perdí mi objeto req.user.

Por lo tanto, si tiene problemas similares, también verifique sus enlaces dentro de su html.

Gracias a todos por su ayuda.

+1

¿Puedes profundizar más sobre cómo puedo verificar mis enlaces? –

0

Puede pasar información de usuario para ver en el router:

res.render('user/dashboad', { 
    ... 
    user: req.session.passport.user, 
    ... 
Cuestiones relacionadas