有効なFacebookアプリを使用してFB.getLoginStatusを呼び出す場合、応答ステータスは常に不明です。正確な応答は{authResponse:undefined、status: "unknown"}です。
<html>
<body>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function(){
FB.init({ appId:'1484134468466778', status:true, cookie:true, xfbml:true});
FB.getLoginStatus(function(response){
console.log(response);
});
};
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
</script>
</body>
</html>
URLの例: http://media.tuentifotos.com/simple_test.html
こちらがFacebookアプリ設定のスクリーンショットです。
これはChromeで発生していました。ChromeがサードパーティのCookieとデータをブロックするように設定されていたためです。
構成を変更すると、FaceBookは問題なくアプリにログインできます。
私もChromeでこの問題に直面しました。ただし、Firefoxでは、ユーザーが以前にログインしたときにステータスがconnected
として返され、期待どおりに機能しました。
私は同様の質問への回答からこれについての手掛かりを見つけました here 。
この問題の根本的な原因は、FB.logout()
でChromeがFB.getLoginStatus()
関数に何らかの影響を与えているCookie _fblo_<your-app-id>
_を削除していないことです。 unknown
を返す
修正:FB.logout()
を呼び出すと、プログラムでCookieを削除できます_fblo_<your-app-id>
_
_FB.logout(function(response) {
deleteCookie("fblo_" + fbAppId); // fblo_yourFBAppId. example: fblo_444499089231295
});
function deleteCookie(name) {
document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
_
私にとって、これは「ログインページ上」を意味し、Cookieを指定する必要がありました。
window.fbAsyncInit = function() {
FB.init({
version: 'v2.8',
cookie : true,
});
};
しかし、私に聞かないでくださいなぜこれが事実でした。また、実際にログインするためにログインボタンを2回クリックする必要があり、FWIWと思われるappIdも必要ないことも修正しました...
チェックしたところ、ステータスが"not_authorized"
になっていますが、まだアプリを承認していないため、問題ありません。
フローを完了するには、ユーザーIDが承認されていないか、Facebookにログインしていない場合は常にFB.login
を追加する必要があります。
window.fbAsyncInit = function(){
FB.init({ appId:'{APP-ID}', status:true, cookie:true, xfbml:true});
FB.getLoginStatus(function(response){
if (response.status === 'connected') {
//proceed
} else if (response.status === 'not_authorized') {
login();
} else {
login();
}
});
};
function login(){
FB.login(function(response) {
if (response.authResponse) {
// proceed
} else {
// not auth / cancelled the login!
}
});
}
わかりましたので、私は最終的にこのいまいましい問題を理解したと思います。
知っておくべきこと:
1)アプリIDを介してFacebookで認証します。これにより、さまざまなCookieが設定され、最後にアプリIDがタグ付けされます。
2)これらのCookieを削除すると、facebookに認証されます(完全にログアウトしない限り)通常のユーザーとして。そして、Facebookのサーバーではこのアプリで承認されていることをまだ知っています。
FB.getLoginStatus()
を再度実行すると、[再作成して元に戻すとなります。これはユーザーが期待するものではありません。これは悪いです。彼らは「ログアウト」をクリックしました。3) ドキュメントはこれを明示的に言っています :
ユーザーはFacebookにログインしていないか、アプリケーションから明示的にログアウトしていないため、Facebookに接続しようとしないため、アプリケーションを認証したかどうかはわかりません。 (わからない)
そのため、このCookieが設定されているかどうかを確認することさえしません。これが、nullまたはundefinedを取得する理由です。したがって、fblo
Cookieは「オプトアウト」のように見なされます。 実際のログアウトは、通常の人がログアウトされていることを意味すると見なしていることではありません。 Cookieが表示されます!もちろん、ユーザーがログインボタンで再度ログインすると、Cookieは削除されます。これは、ユーザーとユーザーが希望するものです。
したがって、(ユーザーのステータスを本当に知る必要がある場合)実行するのが理にかなっているのは、次のことだけだと思います。
fblo_<APPID>
_を実行する前に、_FB.getLoginStatus
_ Cookieの存在を手動で確認してください。1)オプション1
何もしないでください。これで問題が理解でき、Cookieを削除しないこと、そしてFacebookのログインボタンを表示する以外に何もする必要がないことが理解できました。
2)オプション2
その人がアプリのユーザーであると想定し、UIを表示するために必要なことをすべて実行します。しかし、完全な通常のロジックを実行することはありません。これは、ユーザー固有のアプリケーションになります。
3)オプション3
fblo_<APPID>
_をn
に手動で設定します(「y」ではなく)。このCookieはドメインで設定されているため、変更が許可されていることに注意してください。 *開発環境によって異なりますが、クライアント側で行う必要があり、 `/ 'のパスとCookieドメインを指定する必要がある場合があります。getLoginStatus(..., true)
を実行します-Cookieがn
になったため、ブロックされません。ただしここでは通常のロジックを実行しないでください-ユーザーが実際にFacebookユーザーであるかどうか、および/またはアプリで認証されているかどうかを確認するだけなので、.y
に戻します残念なことに、奇妙な競合状態のため、このソリューションはお勧めできません。ほとんど問題なく機能しますが、FBはいつでも故意にまたは偶然にそれを壊す可能性があります。ログインしていないときは本当にログインします。加えて、私がまだ観察していない他のプラグインとのあらゆる種類の複雑さを持っている可能性があります。
getLoginStatus
が常に実行され、正確な情報が提供されることを願っていますが、これが私が目にする唯一の真の解決策です。そして、それは8年間このようになってきたので、私たちはそれで立ち往生していると思います。
4)オプション4-独自のCookieを設定する
ちなみに、私はこの問題を再検討しました。私は自分のWebサイトにメッセンジャープラグインを使用しており、その人がFacebookアカウントを持っていることを知らない限り、それを表示したくないからです。そのため、ログインステータスに正確に対応する必要があります。
同じ問題がありました。すべてのキャッシュとCookieをクリアすることでこれを修正しました。
(アプリで提供した)ライブドメインからテストする必要があります。
ローカルで(ローカルドメインを使用して)テストするときにも同じ問題が発生しました。
IEでも同じ問題が発生しました。フリムジの答えは私に考えさせられました。私はIEを管理者として実行してみましたが、うまくいきました。