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?
'window.user' è il mezzo per passare l'utente dal server al client su una pagina caricata? Se è così, è stato effettivamente impostato? – scarlz
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
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