web-dev-qa-db-ja.com

FB.getLoginStatusが不明なステータスを返す

有効な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アプリ設定のスクリーンショットです。 Facebook App Settings

20

これはChromeで発生していました。ChromeがサードパーティのCookieとデータをブロックするように設定されていたためです。

構成を変更すると、FaceBookは問題なくアプリにログインできます。

  • Chrome設定
  • 詳細設定を表示...
  • プライバシー
  • コンテンツ設定...
  • チェックを外すサードパーティのCookieとサイトデータをブロックする
16
Flimzy

私も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;';
}
_
5
Nagesh Andani

私にとって、これは「ログインページ上」を意味し、Cookieを指定する必要がありました。

  window.fbAsyncInit = function() {
   FB.init({
      version: 'v2.8',
      cookie     : true,
    });
  };

しかし、私に聞かないでくださいなぜこれが事実でした。また、実際にログインするためにログインボタンを2回クリックする必要があり、FWIWと思われるappIdも必要ないことも修正しました...

4
rogerdpack

チェックしたところ、ステータスが"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!
      }
   });
}
3
Sahil Mittal

最終的な答え

わかりましたので、私は最終的にこのいまいましい問題を理解したと思います。

知っておくべきこと:

1)アプリIDを介してFacebookで認証します。これにより、さまざまなCookieが設定され、最後にアプリIDがタグ付けされます。

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2)これらのCookieを削除すると、facebookに認証されます(完全にログアウトしない限り)通常のユーザーとして。そして、Facebookのサーバーではこのアプリで承認されていることをまだ知っています

  • したがって、FB.getLoginStatus()を再度実行すると、[再作成して元に戻すとなります。これはユーザーが期待するものではありません。これは悪いです。彼らは「ログアウト」をクリックしました。

3) ドキュメントはこれを明示的に言っています

ユーザーはFacebookにログインしていないか、アプリケーションから明示的にログアウトしていないため、Facebookに接続しようとしないため、アプリケーションを認証したかどうかはわかりません。 (わからない)

そのため、このCookieが設定されているかどうかを確認することさえしません。これが、nullまたはundefinedを取得する理由です。したがって、fblo Cookieは「オプトアウト」のように見なされます。 実際のログアウトは、通常の人がログアウトされていることを意味すると見なしていることではありません。 Cookieが表示されます!もちろん、ユーザーがログインボタンで再度ログインすると、Cookieは削除されます。これは、ユーザーとユーザーが希望するものです。

したがって、(ユーザーのステータスを本当に知る必要がある場合)実行するのが理にかなっているのは、次のことだけだと思います。

  • _fblo_<APPID>_を実行する前に、_FB.getLoginStatus_ Cookieの存在を手動で確認してください。
  • Cookieが存在しない場合は、何もせずに通常のフローを実行します。
  • Cookieが存在する場合、いくつかのオプションがあります。

1)オプション1

何もしないでください。これで問題が理解でき、Cookieを削除しないこと、そしてFacebookのログインボタンを表示する以外に何もする必要がないことが理解できました。

2)オプション2

その人がアプリのユーザーであると想定し、UIを表示するために必要なことをすべて実行します。しかし、完全な通常のロジックを実行することはありません。これは、ユーザー固有のアプリケーションになります。

3)オプション3

  • Cookie値_fblo_<APPID>_をnに手動で設定します(「y」ではなく)。このCookieはドメインで設定されているため、変更が許可されていることに注意してください。 *開発環境によって異なりますが、クライアント側で行う必要があり、 `/ 'のパスとCookieドメインを指定する必要がある場合があります。
  • getLoginStatus(..., true)を実行します-Cookieがnになったため、ブロックされません。ただしここでは通常のロジックを実行しないでください-ユーザーが実際にFacebookユーザーであるかどうか、および/またはアプリで認証されているかどうかを確認するだけなので、.
  • Cookieの値を手動でyに戻します

残念なことに、奇妙な競合状態のため、このソリューションはお勧めできません。ほとんど問題なく機能しますが、FBはいつでも故意にまたは偶然にそれを壊す可能性があります。ログインしていないときは本当にログインします。加えて、私がまだ観察していない他のプラグインとのあらゆる種類の複雑さを持っている可能性があります。

getLoginStatusが常に実行され、正確な情報が提供されることを願っていますが、これが私が目にする唯一の真の解決策です。そして、それは8年間このようになってきたので、私たちはそれで立ち往生していると思います。

4)オプション4-独自のCookieを設定する

  • 「このユーザーはある時点でFacebookにログインした」、「このユーザーは私のアプリで認証されている」など、特定のことを示すために独自のCookieを設定するオプションが常にあります。しかし、これはすぐに複雑になる可能性があるので、これを行うことには注意が必要です。

ちなみに、私はこの問題を再検討しました。私は自分のWebサイトにメッセンジャープラグインを使用しており、その人がFacebookアカウントを持っていることを知らない限り、それを表示したくないからです。そのため、ログインステータスに正確に対応する必要があります。

1
Simon_Weaver

同じ問題がありました。すべてのキャッシュとCookieをクリアすることでこれを修正しました。

0
divyanshu

(アプリで提供した)ライブドメインからテストする必要があります。

ローカルで(ローカルドメインを使用して)テストするときにも同じ問題が発生しました。

0
magento4u_com

IEでも同じ問題が発生しました。フリムジの答えは私に考えさせられました。私はIEを管理者として実行してみましたが、うまくいきました。

0
Dennis Calla