2011-10-03 2 views
6

注:このWebアプリケーションは、今週のOauth 2.0ワークフローにアップグレードするまでうまくいきました。"server-side-workflow"(OAuth 2.0)を使用してログインした後、FB auth.logoutが呼び出されています。

ユーザーがFacebookに接続すると、Facebook Authentication docsに記載されている「サーバー側ワークフロー」を使用してFacebookにログインします。

window.fbAsyncInit = function() { 
    FB.init({appId: 'XXX', status: true, cookie: true, xfbml: true, channelUrl: 'http://XXX/fbchannel.html', oauth: true}); 
    FB.Event.subscribe('auth.logout', function(response) { 
     logout(); 
    }); 
}; 
(function() { 
    var e = document.createElement('script'); 
    e.type = 'text/javascript'; 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
}()); 
function logout(){ 
    new Ajax.Request('http://XXX/logout'); 
} 

ユーザーがFacebookのにログインしている間、彼らはログインしていないこと表示されます。ユーザーは、次のJavaScriptコードが含まれている我々のアプリケーションで自分のホームページに取得するときしかし、Facebookはauth.logoutイベントを上げています(もしあなたがブラウザの第2タブにfacebook.comを開いて、アプリケーションでログインした後にページを再ロードすると、実際にfacebook.comにログインしていることになります)。

OAuthの以前のバージョンでは不要だった「サーバー側のワークフロー」を使用する際に、ユーザーをアプリケーションにログインさせるために追加の手順が必要ですか?接続した後、ユーザーは明示的にFacebook経由でログインする必要がありますか?

ご協力いただければ幸いです。クライアント側の流れを経て、当社のアプリケーションへのログイン ジェイソン

PS-が(以前に接続した後)だけで正常に動作し、事前に

おかげで、。サーバー側のワークフローを介して接続してログインしている場合にのみ、自動ログアウトの問題が発生します。

+3

私は私のauth.logoutイベントハンドラでFB.getLoginStatusへの呼び出しを追加し、応答を確認することでこの問題を解決することができましたauthResponseオブジェクトの場合FB.getLoginStatusがユーザーがログインしていることを示すauthResponseを返したときにFacebookがauth.logoutをなぜ上げるのか分かりませんが、そうしています。 FB.getLoginStatus(function(res){ if(!res.authResponse){ logout(); } FB.EventSscribe( 'auth.logout'、function(response){ } }); }); – Jason

+0

素晴らしい発見!それがまだ起こっているのか、Facebookがこれを修正したのかどうかは不思議です... – DMCS

+0

私のアプリケーションでもこの現象が見られ始めました。私はあなたと同じハックを思いついたが、私はそれに少し不快である。 –

答えて

0

ajaxページでは、ブラウザセッションからuid、access_token、またはコードを取得する必要があります。

これは、クリックジャック防止やその他のセキュリティリスクのためのiframeとajaxの標準です。 SEE:http://tools.ietf.org/html/rfc6749#section-10.13


迅速かつ汚い例:

<?php 
// be sure to exchange YourAppId, with your app id. 

if(isset([fb_YourAppId_user_id])){ 
$user = [fb_YourAppId_user_id]; 
}else { // no user, send to login flow. } 

if(isset([fb_YourAppId_access_token])){ 
$access_token = [fb_YourAppId_access_token]; 
} else { // no user, send to login flow } 

?> 
関連する問題