2013-08-21 4 views
2

단일 페이지 응용 프로그램의 서버로 express라는 노드를 사용하고 있습니다. (AngularJS를 사용하고 있지만 질문과 관련이 없습니다). passportJS 또는 everyauth를 사용하여 인증 기능을 추가해야합니다. 나는 다른 패키지를 사용할 수 없다. 내 단일 페이지 응용 프로그램에서 인증 작업을 수행하기 위해 여러 번 시도했지만 페이지 새로 고침 없이는 할 수 없었습니다. 페이스 북과 연결할 수있는 방법을 찾고 있는데 이것은 내 프런트 엔드 코드입니다.단일 페이지 응용 프로그램에서 passportJS 또는 everyauth 사용

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

어떻게 생각하나요? 아니면 예를 들고 어딘가에? 페이지를 새로 고치지 않고 에 연결해야합니다.

+1

비슷한 해결책을 찾고 있는데, 할 수있는 유일한 방법은 무기명 전략 (여권 - http-bearer)을 사용하는 것입니다. 시도해 보셨습니까? –

+0

@GuyKorland : 아니오 ..이 패키지는 무엇입니까? – Naor

+0

이것은 무기명 인증을 허용하는 여권 용 플러그인입니다. –

답변

3

내가 설정 한 해결책은 passport.js를 호출하는 다른 창 (예 : FB.login)을 팝업 한 다음 프로세스가 종료되면 창을 닫고 기본 창에서이를 모니터링하는 것이 었습니다. (BTW, 그것은 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> 
0

이것은 조금 늦었지만 같은 문제가 있습니다.

내 솔루션은 Fb.login()을 사용하여 리디렉션없이 브라우저에서 토큰을 요청하는 것입니다 (사용자가 아직 앱을 수락하지 않은 경우 FB 작은 팝업 만 표시). 그런 다음 토큰의 유효성을 검사하고 세션을 만드는 등 내 서버 응용 프로그램 (Ajax 호출, 다시는 리디렉션이 없음)에 또 다른 요청을하여 passport-facebook-token과 함께 세션을 만듭니다.

+0

다른 사람이 나를 필요로한다면 좀 더 정교하게 설명 할 수 있습니다. +1 : –