2014-06-21 9 views
6

Ich versuche, meinen Benutzer über Facebook mit der Verwendung von PassportJS anzumelden und die Benutzerdaten an Angular weiterzuleiten. Auf der Serverseite sieht alles durch den folgenden Code für den Rückruf Facebook Benutzer Controller ok:Benutzerdaten von Nodejs Server nach erfolgreicher Anmeldung in Angular verschieben

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

Von dem, was ich von dem PassportJS docs verstehen, req.login Aufruf sollte Benutzerdaten in die Sitzung gestellt.

Meine Strecken auf der Server-Seite sieht folgendermaßen vor:

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

express und Passkonfiguration umfasst:

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

nun auf der Winkel Seite Ich versuche, die Benutzerdaten aus der Sitzung in einem zu bekommen Service definiert wie folgt:

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; 

    } 
]); 

Leider sind die Benutzerdaten nicht verfügbar in window.user auf winkliger Seite. Irgendwelche Ideen, was ich hier falsch mache?

+0

Ist 'window.user' Ihr Mittel, um den Benutzer beim Laden einer Seite vom Server zum Client zu leiten? Wenn ja, ist das tatsächlich eingestellt worden? – scarlz

+0

Nicht wirklich. Ich bin neu in der Welt von JS, also verstehe ich vielleicht nicht alles. Hier ist, wie ich es sehe: Die Funktion req.login von PassportJS legt die Benutzerdaten in die Sitzung (und es wurde durch das Debuggen bestätigt), jetzt auf der Clientseite ist diese Sitzungsvariable in dem Fensterobjekt verfügbar. Liege ich hier falsch? – Jakub

+0

Passport stellt Ihren authentifizierten Benutzer über 'req.user' zur Verfügung, dies ist jedoch nicht auf dem Client verfügbar (wo' window' existiert), es sei denn, Sie haben ihn als solchen festgelegt. Können Sie oberhalb der Funktion, die Ihre Indexseite rendert, einbeziehen? – scarlz

Antwort

3

Das Passportsitzungsobjekt ist nicht auf dem Fensterobjekt verfügbar, stattdessen müssen Sie es vom Server mithilfe eines Diensts oder einer Weiterleitungs-URL abrufen.

Nach erfolgreicher Authentifizierung wird die primäre Route-Funktion aufgerufen, , die in diesem Fall den Benutzer auf die Homepage umleiten wird.

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

oder Sie können eine Route erstellen die in Benutzerdaten angemeldet erhalten

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

Auf der Angular Seite, können Sie die Benutzerdaten zu rootscope aus dem $ HTTP-Antwort gesetzt,

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

Wie Girish sagte, ist das Passsitzungsobjekt auf der Clientseite nicht verfügbar. Wie Sie scheinen, express zu verwenden, ist eine einfache Möglichkeit, dies zu tun, zu verwenden.

Wenn Sie die Benutzerdaten auf allen Seiten verfügbar sein sollen, wenn der Benutzer authentifiziert ist, können Sie so etwas wie dies, bevor Sie Ihre Routen Erklärung

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

Die Benutzerdaten werden zur Verfügung stehen Clientseite als window.user hinzufügen.

Verwandte Themen