2014-06-21 12 views
6

Cerco di accedere al mio utente tramite Facebook con PassportJS e passare i dati utente ad Angular. Sul lato server tutto sembra ok con il seguente codice per la richiamata Facebook controller utenti:Trasferimento dei dati utente dal server Nodejs ad Angular dopo il login riuscito

exports.facebookCallback = function() { 
return function(req, res, next) { 
    passport.authenticate('facebook', function(err, user, email) { 
     if (err || !user) { 
      return res.redirect('/auth'); 
     } 
     req.login(user, function(err) { 
      if (err) { 
       return res.redirect('/auth'); 
      } 
      return res.redirect('/'); 
     }); 
    })(req, res, next); 
}; 
}; 

Da quello che ho capito dai PassportJS docs, chiamando req.login dovrebbe mettere i dati utente nella sessione.

miei percorsi sul lato server cerca seguente:

app.get('/auth', usersCtrl.auth); 
app.get('/auth/signout', usersCtrl.logout); 
app.get('/auth/facebook', passport.authenticate('facebook', { 
    scope: ['email', 'user_hometown'] 
})); 
app.get('/auth/facebook/callback', usersCtrl.facebookCallback()); 

espresso e la configurazione del passaporto comprende:

app.use(express.cookieParser()); 
app.use(express.session({secret: '1234567890QWERTY'})); 
app.use(express.bodyParser()); 
app.use(passport.initialize()); 
app.use(passport.session()); 

Ora sul lato angolare cerco di ottenere i dati utente dalla sessione in un servizio definito in questo modo:

module.exports = require('angular') 
.module('HomeModule', []) 
.controller('HomeCtrl', function ($scope) { 
     //home controller code ors here 
}).controller('NavbarCtrl', ['$scope', 'Authentication', function ($scope, Authentication) { 
    $scope.authentication = Authentication; 
    //rest of the navbar controller goes here 
}]).factory('Authentication', [ 
    function() { 
     var _this = this; 

     _this._data = { 
      user: window.user 
     }; 

     return _this._data; 

    } 
]); 

Inavvertitamente, i dati utente non sono disponibili in window.user sul lato angolare. Qualche idea su cosa sto facendo male qui?

+0

'window.user' è il mezzo per passare l'utente dal server al client su una pagina caricata? Se è così, è stato effettivamente impostato? – scarlz

+0

Non proprio. Sono nuovo nel mondo JS, quindi potrei non capire tutto. Ecco come la vedo io: la funzione req.login di PassportJS inserisce i dati dell'utente nella sessione (ed è stata confermata dal debug), ora sul lato client questa variabile di sessione è disponibile nell'oggetto della finestra. Ho sbagliato qui? – Jakub

+0

Il passaporto rende l'utente autenticato disponibile per esprimere tramite 'req.user', ma questo non sarà disponibile nel client (dove esiste' window') a meno che non lo si imposti come tale. Puoi includere sopra la funzione che sta visualizzando la tua pagina indice? – scarlz

risposta

3

L'oggetto della sessione del passaporto non sarà disponibile sull'oggetto della finestra, ma è necessario ottenerlo dal server utilizzando un servizio o un URL di reindirizzamento.

Dopo l'autenticazione riuscita, verrà chiamata la funzione di instradamento principale, che, in questo caso, reindirizzerà l'utente alla pagina iniziale.

app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { failureRedirect: '/login' }), 
    function(req, res) { 
    res.redirect('/'); 
    }); 


    app.get('/', function(req, res){ 
    res.render('index', { user: req.user }); 
    }); 

oppure è possibile creare un percorso per ottenere i clienti registrati i dati degli utenti

app.get('/account', function(req, res){ 
    if (req.isAuthenticated()) { 
     res.send({user : req.user}); 
    }else{ 
     res.redirect('/login'); 
    } 
    }); 

Sul lato angolare, è possibile impostare i dati utente per rootscope dalla risposta $ http,

$rootScope.session = {} 
$rootScope.session.user = res.user; 
4

Come ha detto Girish, l'oggetto della sessione del passaporto non sarà disponibile sul lato client. Come sembra che tu stia usando express, un modo semplice per farlo è usare express-expose.

Se si desidera che i dati degli utenti siano disponibili su tutte le pagine in cui l'utente è autenticato, è possibile aggiungere qualcosa di simile prima della dichiarazione di percorsi

app.use(function (req, res, next) { 
    if (req.isAuthenticated()) res.expose(req.user, 'user'); 
    next(); 
}); 

I dati utente saranno disponibili lato client come window.user.

Problemi correlati