9

私は Facebook SDK for Android に完全に驚いています。効果的に使用するのは非常に困難です。私が理解しているように、これらはシングル サインオンのルールです。

  • ユーザーが Facebook アプリを持っていて、SDK を使用してサードパーティ アプリにログインすると、Facebook アプリもログインされます。
  • ユーザーが SDK を使用してサードパーティ アプリからログアウトした場合、Facebook アプリはサインインしたままになります (おそらく最善の方法です)。
  • ユーザーが Facebook アプリからログアウトしても、SDK を使用するサードパーティ アプリは影響を受けません。

Facebook SDK を使用する Android アプリで、公式の Facebook アプリが Android アプリが使用しているのと同じアカウントにサインインしていないかどうかを確認し、その場合は Android アプリからサインアウトする方法はありますか。 ..つまり、Facebookアプリに行ってサインアウトしてから、サードパーティのアプリに行くと、ログアウトされますか?

4

3 に答える 3

7

更新された回答

Facebook SDK を使用する Android アプリで、公式の Facebook アプリが Android アプリが使用しているのと同じアカウントにサインインしていないかどうかを確認し、その場合は Android アプリからサインアウトする方法はありますか。 ..

私がこれを正しく理解している場合、あなたは私たちができるかどうか尋ねています:

  • アプリから、公式の Android アプリがインストールされているかどうかを確認します
  • インストールされている場合は、アプリと同じアカウントにサインインしているかどうかを確認してください
  • 公式アプリがアカウントにサインインしていない場合は、アプリをサインアウトします

簡単な答え: いいえ。ただし、独自の Facebook クラスを作成することで可能です。

  • 公式の FB アプリがインストールされていないか、ログアウト状態にあるか、または別のアカウントにログインしているかどうかを確認します。
  • いずれかの場合は、アプリに強制的にログイン ダイアログを表示させます。

長い答え:

Single Single On(SSO) は、Facebook Android SDK の Facebook クラスで処理されます。Facebook クラス API には、SSO プロセスへのアクセスや変更を可能にするメソッドがありません。

Facebook クラスには、4 つのオーバーロードされた public 承認メソッドがあります。そのうちの 3 つは 4 番目を呼び出します。

public void authorize(Activity activity, String[] permissions,
        int activityCode, final DialogListener listener)

ここで、SSO プロセスが開始されます。次のように SSO をチェックします。

 // Prefer single sign-on, where available.
    if (activityCode >= 0) {
        singleSignOnStarted = startSingleSignOn(activity, mAppId,
                permissions, activityCode);
    }
    // Otherwise fall back to traditional dialog.
    if (!singleSignOnStarted) {
        startDialogAuth(activity, permissions);
    }

プライベートな startSingleSignOn メソッドは、公式の Facebook アプリが認証プロセスを管理できるかどうかを確認します。

private boolean startSingleSignOn(Activity activity, String applicationId,
        String[] permissions, int activityCode) {
    boolean didSucceed = true;
    Intent intent = new Intent();

    intent.setClassName("com.facebook.katana",
            "com.facebook.katana.ProxyAuth");
    intent.putExtra("client_id", applicationId);
    if (permissions.length > 0) {
        intent.putExtra("scope", TextUtils.join(",", permissions));
    }

    // Verify that the application whose package name is
    // com.facebook.katana.ProxyAuth
    // has the expected FB app signature.
    if (!validateActivityIntent(activity, intent)) {
        return false;
    }

    mAuthActivity = activity;
    mAuthPermissions = permissions;
    mAuthActivityCode = activityCode;
    try {
        activity.startActivityForResult(intent, activityCode);
    } catch (ActivityNotFoundException e) {
        didSucceed = false;
    }

    return didSucceed;
}

このメソッドは、正式な Facebook アプリのパッケージであるパッケージ com.facebook.katana 内のクラス ProxyAuth の明示的なインテントを作成します。次にメソッドは、インテントをパラメータとして validateActivityIntent を呼び出します。サービス インテントの解決が正常に行われ、FB 署名が一致する場合は true を返します。

ProxyAuth クラス ソースへのアクセス権はありませんが、質問とコメントで説明した観察されたアプリの動作に基づいて、ProxyAuth は、ユーザーが公式アプリで同じアカウントにログインしている場合にのみ認証プロセスを完了するようです。あなたのアプリで。これは、1) 公式の FB アプリがインストールされていない、2) 公式の FB アプリがログイン状態にない、3) 別のアカウントにログインしている、をアプリから区別する方法がないことを意味します。

だからあなたはこれを行うことができます:

  • FB アプリがインストールされていないか、ログインしていないか、別のアカウントにログインしているかどうかを確認します。
  • いずれかの場合は、アプリをログアウトしてください。

しかし、あなたはできません

  • 公式 FB がインストールされていて、ログアウト状態であることを確認します。
  • 公式の FB アプリがインストールされていて、別のアカウントにログインしていることを確認してください。

上記の方法でサインアウトをトリガーする必要がある場合は、独自のカスタム Facebook クラスを記述して新しいロジックを追加する必要がありますFacebook Android SDK の Facebook クラスは抽象クラスを拡張せず、Object のみを暗黙的に拡張するため、Facebook コードを CustomFacebook クラスに複製し、それを変更して強制的にログアウトするコードを追加する必要があります。

参考のため:

古い答え

これがあなたの質問に答えるかどうかはわかりませんが、Facebook Android SDK でユーザーを強制的にログアウトさせるには、認証/ログイン中に authorize() を呼び出すときに FORCE_DIALOG_AUTH フラグを使用します。

mFacebook.authorize(this, PERMS, mFacebook.FORCE_DIALOG_AUTH, new LoginDialogListener());

ここで、mFacebook は SDK の Facebook クラスのインスタンスであり、LoginDialogListener は DialogListener を実装します。

ユーザーがログアウトすると、次にユーザーがログインするか、アプリを起動するときに、ログイン ダイアログが表示されるようになります。

FORCE_DIALOG_AUTH フラグを設定しない場合、ユーザーは「自動的に」ログインします。

于 2012-05-12T13:10:27.617 に答える
1

コメントはほとんどありません。これがお役に立てば幸いです。

Facebookアプリがマスターアプリである場合、(または他の)アプリのログイン/ログアウトアクションは影響しません。アプリはSSOフローを介して独自のアクセストークンを取得しますが、これはマスターアプリとは関係ありません。

単に; SSOを完了すると、有効期限が約2時間のappidにaccess_tokenが割り当てられます(offline_access権限を要求しない場合)。

-トークンの有効性を確認する方法は?最も簡単な方法は、HTTPGETを使用してプロファイルをロードすることです。

https://graph.facebook.com/me?access_token=<access_token>

トークンが無効な場合、応答は明確にそれを示します

-トークンを無効化(ログアウト)する方法は?そのエンドポイントに対してHTTPGET呼び出しを行うことができます。例を参照してください

https://api.facebook.com/restserver.php?method=auth.expireSession&format=json&access_token=<access_token>
于 2012-04-25T08:04:05.483 に答える
0

1)公式のFBアプリがインストールされているかどうかを確認するのはとても簡単です。インストールされている場合、 facebook.authorize(blah,blah,blah) によってアプリ内のログイン画面が表示されます。インストールされていない場合は、認証のために webview に切り替わります。

2) 共有設定から access_token を取得して存在するかどうかを確認し、ログアウト時にそれをクリアしてみてください。

于 2012-09-21T12:17:51.233 に答える