客户端会话使用护照oauth2登录MEAN堆栈应用程序

时间:2016-12-06 16:39:25

标签: node.js oauth-2.0 passport.js mean-stack

我已经整理了一个平均堆栈应用程序。我现在正在按照我在这里和那里找到的教程来实现用户身份验证。我已经使用谷歌的oauth2成功实施了身份验证护照,但我无法找到任何关于如何在客户端(Angular)管理身份验证以保持用户登录的资源。我希望用户登录然后导航通过我的应用程序自由,无需每次想要访问限制角度路径时查询服务器进行身份验证。

以下是我如何解决这个问题的想法: 服务器应该只对用户进行身份验证,但不应该更改他在应用程序中的位置,这是我在使用google管理回调时成功的>重定向。我不应该重定向,而应该将一个令牌发送回角度应用程序,该应用程序将存储在客户端,并且将证明用户已登录。要取消登录,我只需要删除令牌客户端并向服务器发送请求,以便他将goout()调用google,这将使用户退出服务器。这种方法的问题在于我只知道当我的应用程序获得Google的回调时用户已登录,这意味着我无法在查询响应中将令牌传递给我的客户端,就像我对常规电子邮件一样+密码登录情况。

以下是我服务器的代码示例:

我服务器的身份验证路线:

router.get('/auth/google', passport.authenticate('google', { scope : ['profile', 'email'] }));

router.get('/auth/google/callback',
    passport.authenticate('google', {
              successRedirect : '/',
              failureRedirect : '/login'
}));

护照的策略:

passport.use(new GoogleStrategy({

        clientID        : configAuth.googleAuth.clientID,
        clientSecret    : configAuth.googleAuth.clientSecret,
        callbackURL     : configAuth.googleAuth.callbackURL,

    },
    function(token, refreshToken, profile, done) {




        process.nextTick(function() {


            User.findOne({ 'id' : profile.id }, function(err, user) {
                if (err)
                    return done(err);

                if (user) {


                    return done(null, user);

                }

                if(profile.emails[0].value.indexOf("@mycompany.edu") == -1){
                  return done("user not from mycompany"); 
                } 
                else {

                    var newUser          = new User();


                    newUser.id    = profile.id;
                    newUser.token = token;
                    newUser.name  = profile.displayName;
                    newUser.email = profile.emails[0].value; 


                    newUser.save(function(err) {
                        if (err){
                            throw err;
                          }
                        return done(null, newUser);
                    });
                }
            });
        });

    }));

1 个答案:

答案 0 :(得分:0)

我已经使用查询服务器检查用户是否在每次访问受保护的角度路由之前登录。

要做到这一点,我只是"间谍" app.run()中的状态更改使用:

    $rootScope.$on('$stateChangeStart', function(event, nextRoute, currentRoute){
        if(nextRoute.name === "login"){ //check if nextRoute is 'login' before proceeding to avoid infinite loop!
          return;
        }
// am I trying to access a restricted route ?
        if($location.path().indexOf('/restricted') != -1){ 
            authentification.checkLoggedIn($state);
        }
    });

chekLoggedIn()是服务验证的一个功能,它只使用$ q.defer()来调用服务器,询问用户是否经过身份验证。

我不是很有经验,所以如果有人能证实这是一种安全的做事方式,我会很高兴:)