2

我正在使用带有 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
    }
});

知道我该怎么做吗?或者有一个例子的地方?请记住,我需要在不刷新页面的情况下进行连接。

4

2 回答 2

3

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

  1. 设置标准的passport.js

意义:

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

客户端:

<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>
于 2013-08-27T19:12:01.760 回答
2

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

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

于 2017-05-09T21:53:41.270 回答