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

我使用快递节点作为我的单页面应用程序的服务器(我正在使用AngularJS,但这是不相关的问题)。 我需要使用passportJS或everyauth来添加身份validationfunction。 我不能使用其他包。 我尝试了很多次,使我的单页应用程序的authentication工作,但我没有设法做到这一点,没有页面刷新。 我正在寻找一种连接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 } }); 

任何想法我怎么能做到这一点? 或者在某个地方举个例子? 请记住,我需要连接, 而不刷新页面

我设置的解决scheme是popup另一个窗口(如FB.login),它调用passport.js然后当进程结束窗口closures它自我和主窗口监视它。 (顺便说一下,它和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> 

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

我的解决scheme是使用Fb.login()来从浏览器中请求令牌,而无需任何redirect(如果用户尚未接受应用程序,只是FB小的popup窗口)。 然后,我再次请求我的服务器应用程序(ajax调用,所以再次没有redirect)validation令牌,创build会话等与护照,Facebook的令牌 。