在单页面应用程序中使用passportJS或everyauth

时间:2013-08-21 19:35:09

标签: node.js express passport.js everyauth

我使用express作为单页应用程序的服务器节点(我使用的是AngularJS,但这与问题无关)。我需要使用passportJS或everyauth添加身份验证功能。我不能用其他包。我多次尝试在我的单页应用程序上进行身份验证,但是如果没有页面刷新我就无法做到这一点。我正在寻找一种与Facebook连接的方法,这是我的前端代码:

function facebookLogin(callback) {
    FB.login(function (response) {
        if (!response.authResponse) {
            console.log('Facebook login failed', response);
            callback(false, response);
        } else {
            console.log('Facebook login complete', response);
            callback(true, response);
        }
    });
}

facebookLogin(function(isConnected, response) {
    if (isConnected) {
        // HERE I NEED TO CALL SERVER SIDE AND CONNECT USING PASSPORT OR EVERYAUTH
        // I WANT TO DO IT WITHOUT PAGE REFRESH
    }
});

知道我该怎么办?或者某处有一个例子? 请记住,我需要连接没有页面刷新

2 个答案:

答案 0 :(得分:3)

我设置的解决方案是弹出另一个调用passport.js的窗口(如FB.login),然后当进程结束时,窗口自动关闭,主窗口监视它。 (顺便说一句,它与FB.login代码非常相似,但它仍然使用passport.js轻松集成)

  1. 设置标准passport.js
  2. 含义:

    app.get('/auth/facebook', passport.authenticate('facebook', { scope:['email']}));
    app.get('/auth/facebook/callback', passport.authenticate('facebook', {failureRedirect:'/'}), successRedirect);
    
    passport.use(new FacebookStrategy({
        clientID: Settings.FB.CLIENT_ID,
        clientSecret: Settings.FB.CLIENT_SECRET,
            callbackURL: Settings.FB.CALLBACK_URL
        },myHandler;
        }
    ));
    
    function successRedirect(){
        res.send('<html><head><script type="text/javascript">window.close();</script></head></html>');   
    }
    
    1. 客户方:

      <a onclick="loginShopetti('/auth/google')"><img src="/imgs/FB-button.png"></a>
      
      <script>
      function loginShopetti(url){
          var win = window.open(url,'popUpWindow','centerscreen=true');
          var intervalID = setInterval(function(){
              if (win.closed) {
      
                  //***** DO MY after login code.********
      
                  clearInterval(intervalID);
              }
          }, 100);
      }
      </script>
      

答案 1 :(得分:0)

这有点晚了,但我遇到了同样的问题。

我的解决方案是使用Fb.login()从浏览器请求令牌而不进行任何重定向(如果用户尚未接受应用,则只显示FB小弹出窗口)。然后我向我的服务器应用程序发出另一个请求(ajax调用,因此再次没有重定向)以使用passport-facebook-token验证令牌,创建会话等。