2

シングルページアプリケーションのサーバーとしてエクスプレスでノードを使用しています(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>');   
}
  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>
于 2013-08-27T19:12:01.760 に答える