2011-08-25 3 views
2

사용자 인증에 FB의 oauth를 사용하고 있지만 권장되는 것으로 보이는 것을 사용하여 로그 아웃하는 데 문제가 있습니다. 접근법 : FB JDK를 사용하는 FB.logout.oauth, FB.getLoginStatus & IE, Chrome, Firefox 및 Android 브라우저의 FB.logout

특히 FB JDK를로드하고 FB.init을 호출 한 후 FB.logout을 호출하면 Chrome 또는 Firefox를 사용하는 경우 oauth 중에 부여 된 FB 인증이 취소됩니다. 그러나 IE 나 Android 브라우저에서는 작동하지 않습니다. 내가 IE와 안드로이드 브라우저에서 작동하지 않는다고 말할 때, FB.logout을 호출 한 후 www.facebook.com/dialog/oauth..으로 리디렉션하면 사용자가 자격 증명을 다시 입력하라는 메시지를 표시하지 않고 콜백 페이지를로드합니다. 크롬과 파이어 폭스에서는 그 시점에서 '올바르게'묻습니다.

다양한 디버깅 시도를 통해 FB.getLoginStatus (심지어 FB.logout을 호출 한 후) 호출은 모든 브라우저의 콜백에 유효한 response.session 객체를 전달한다는 것을 알게되었습니다. 따라서 FB.getLoginStatus에 따르면 FB.logout 후에도 모든 브라우저에서 세션이 계속 활성화됩니다. 이것은 FB.logout이 전혀 작동하지 않는다는 것을 궁금하게 만듭니다.

oauth와 FB JDK는 서로 다른 두 가지 기능을 가지고 있으며 꼭 같이 놀아야 할 필요는 없지만 FB.logout을 호출하는 것 외에도 FB oauth 세션을 종료하는 다른 대안을 보지 못했습니다.

다른 사람이 이런 불규칙성을 보았거나 해결책이 있습니까? 감사. 당신의 방법을 사용하여 마이클

답변

0

당신은 당신의 로그 아웃 링크에 access_token은 사용자를 추가해야합니다. 또는

로그인 버튼 자동 로그 아웃 링크 기능을 사용합니다. 내가 위의 내용을 게시 한 후

<div id="fb-root"></div> 
<script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
    appId : '135669679827333', 
    status : true, // check login status 
    cookie : true, // enable cookies to allow the server to access the session 
    xfbml : true, // parse XFBML 
    //channelUrl : 'http://WWW.MYDOMAIN.COM/channel.html', // channel.html file 
    oauth : true // enable OAuth 2.0 
     }); 
     // redirect user on login 
     FB.Event.subscribe('auth.login', function(response) { 
     top.location.href = 'http://example.com/loggedin/'; 
     }); 
     // redirect user on logout. 
     FB.Event.subscribe('auth.logout', function(response) { 
     top.location.href = "http://example.com/loggedout/"; 
     }); 
     }; 
     (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
</script> 
<fb:login-button autologoutlink='true' scope='email,publish_stream'></fb:login-button> 
+0

여기에서 로그인하는 라이브의 예 [link] (http://shawnsspace.com/plugins/af.php) –

3

autologoutlink = '진정한'나는이 대답을 발견

FB.logout not working in IE8

그것은이의 setTimeout 기능에 FB.logout를 호출 한 후 리디렉션을 두는 것이 좋습니다. 기본적으로 FB.logout 기능을 약 2000ms 동안 완료하십시오.

나는 그것을 시도하고 IE와 안드로이드 브라우저 모두에서 문제를 해결했다. 기본적으로 Chrome과 Firefox는 브라우저에서 새 페이지가로드되기 전에 FB.logout이 실행을 완료 할 수있을만큼 빠른 자바 스크립트 엔진을 가지고 있습니다. 반면 IE와 Android 브라우저는 그렇지 않습니다.

그 논리에 따라, FB.logout에 콜백 함수가있는 이유가 있다는 것을 깨달았습니다. setTimeout 지연으로 재생하는 것과는 달리 리다이렉트를 사용하는 것이 더 안전 할 수 있습니다.

function mysignout() 
{ 
    FB.logout(function() 
    { 
     top.location.href = '../mobile.php' 
    }); 
} 

호기심에서 벗어나 Chrome과 IE에서 콜백을 실행할 때 어떤 타이밍 차이가 있는지 테스트했습니다. Chrome은 로그 아웃을 완료하는 데 2511ms가 걸렸으며 IE는 3517ms를 소비했습니다. FB.logout이 쿠키를 로컬에서 삭제하고 전혀 시간이 걸리지 않는다는 것을 알았 기 때문에 혼란 스럽습니다. 대신, 그것은 서버에서 인증을 취소하는 일종의 아약스 호출처럼 보입니다. 그리고 상당한 시간이 걸립니다.

+0

+1. 'getUser()'가 ID를 반환하는 동안 다른 API 호출이 Facebook API Exception을 던지고있었습니다. 다른 페이지에서 로그 아웃 한 후 즉시 사용자 상태를 확인했습니다. 완전히 로그 아웃하는 데 몇 초가 걸렸습니다. – Ali

0

당신이 로그 아웃 한 후 사용자를 리디렉션하지 않으려면하거나 FB 세션, 당신은 수동으로 세 가지 명령으로 정리 할 수있는 클라이언트 측에서 명확한 것을 확인 얻으려면 :

FB._authResponse = null; 
FB._userStatus = null; 
document.cookie = 'fbsr_' + FB._apiKey + '=;'; // clear the facebook cookie 

FB.logout() 없이도 실행할 수 있지만,이 경우 사용자는 Facebook에서 로그 아웃되지 않으므로 새로 고침을 한 후 다시 로그인하게됩니다.

관련 문제