成功登录后,将用户数据从Nodejs服务器推送到Angular

时间:2014-06-21 12:30:20

标签: javascript angularjs node.js express passport.js

我尝试使用PassportJS通过Facebook登录我的用户并将用户数据传递给Angular。 在服务器端,用户控制器中的Facebook回调代码如下所示:

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

根据我对PassportJS文档的理解,调用req.login应该将用户数据放入会话中。

我在服务器端的路由如下:

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());
快递和护照配置包括:

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

现在,在角度方面,我尝试从如下定义的服务中获取会话中的用户数据:

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;

    }
]);

不幸的是,用户数据在角度侧的window.user中不可用。 我在这里做错了什么想法?

2 个答案:

答案 0 :(得分:4)

正如Girish所说,护照会话对象在客户端无法使用。在您似乎使用express时,一种简单的方法是使用express-expose

如果您希望在用户通过身份验证后所有页面上都可以使用这些用户数据,您可以在路由声明之前添加类似的内容

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

用户数据在客户端可用window.user

答案 1 :(得分:3)

护照会话对象在窗口对象上不可用,而是需要使用某些服务或重定向网址从服务器获取。

验证成功后,将调用主路由功能, 在这种情况下,它会将用户重定向到主页。

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

或者您可以创建路线以获取登录的用户数据

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

在Angular端,您可以从$ http响应

将用户数据设置为rootscope
$rootScope.session = {}
$rootScope.session.user = res.user;