2012-06-25 3 views
17

Sto usando pssportjs con express 2.xe una memoria di sessioni. Dopo un accesso sto ricevendo req.User solo una volta. Non appena reindirizzamento di nuovo req.User non è definito.PassportJS: Come ottenere req.user nelle mie viste

Ecco la mia configurazione:

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')); 
}); 

Queste sono le mie vie:

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 
      }); 
}); 

E infine ecco come sto cercando di accedere all'oggetto utente a mio avviso:

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

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

Dopo l'autenticazione con facebook, la mia vista visualizza correttamente nome e cognome. Dopo un'altra richiesta di pagina, req.User è undefiend (la deserializzazione non viene invocata).

Cosa sto sbagliando?

+2

Nizza domanda. Ha aiutato molto :) –

+0

È sciocco che questo abbia aiutato più della documentazione "ufficiale", gli sviluppatori dovrebbero davvero impiegare più tempo a spiegare il loro lavoro. –

risposta

10

Utilizzare gli helper dinamici. Ecco un esempio del mio barebone user oggetto:

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 
     } 
    } 
}); 

Poi da vista si può semplicemente utilizzare #{user.name} o if user.isAdmin ecc come oggetto user è ora accessibile ad altre parti del app.

È possibile aggiungerlo a app.js o richiedere da un file esterno. Tengo tutti i miei aiutanti dinamici sotto /utils/helpers.js

2

Hai impostato il middleware del passaporto? Dal document, è necessario fare

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)); 
}); 

se si utilizza 3.x Express o Collegare 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

Sto usando express 2.x e l'ho configurato esattamente così (ma con un archivio di sessione mongo). Ho intenzione di aggiornare la mia domanda. Devo aggiornare per esprimere 3.x? – Sven

+0

Non sono sicuro di quale versione sia migliore. Penso che l'utilizzo dell'ultima versione sia interessante ed educativo poiché vedo come TJ sta migliorando l'implementazione in tempo reale. – smagch

2

Va bene ho capito:

L'errore che ho non era nel codice che ho postato sopra, che è corretto. Ho avuto un modo sbagliato di collegamento agli URL, quindi ho forzato in qualche modo l'espressione per creare una nuova sessione ogni volta che usavo uno dei collegamenti interrotti. Con la nuova sessione ho perso anche il mio oggetto req.user.

Quindi, se si verificano problemi simili, controllare anche i collegamenti all'interno del proprio html.

Grazie a tutti per il vostro aiuto.

+1

Puoi approfondire il modo in cui posso controllare i miei collegamenti? –

0

È possibile trasmettere informazioni all'utente di visualizzare in Router:

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