android - Facebook 单点登录 : when user logs out of Facebook app, 如何退出我的应用程序?

标签 android facebook facebook-graph-api

Android 版 Facebook SDK 让我大吃一惊——有效使用它非常具有挑战性。据我了解,这些是单点登录的规则:

  • 如果用户拥有 Facebook 应用并使用 SDK 登录第三方应用,则 Facebook 应用也会登录
  • 如果用户使用 SDK 注销第三方应用,Facebook 应用仍处于登录状态(可能是最好的)
  • 如果用户退出 Facebook 应用,使用 SDK 的第三方应用不受影响

有没有办法在使用 Facebook SDK 的 Android 应用程序中检查官方 Facebook 应用程序是否未登录到 Android 应用程序正在使用的同一帐户,如果是这样,请退出Android 应用程序...换句话说,如果您进入 Facebook 应用程序并注销,然后转到第三方应用程序,它会被注销吗?

最佳答案

更新的答案

Is there a way, in an Android app using the Facebook SDK, to check and see if the official Facebook app is NOT signed into the same account the Android app is using, and if that is the case, sign out of the Android app...

如果我没理解错的话,你是在问我们是否可以:

  • 在您的应用中,检查是否安装了官方安卓应用
  • 如果已安装,请检查它是否登录到与您的应用相同的帐户
  • 如果官方应用未登录您的帐户,请退出您的应用

简短回答:不,但是你可以,通过编写你自己的 Facebook 类

  • 检查官方 FB 应用程序是否未安装或处于注销状态或已登录到另一个帐户。
  • 如果是这种情况,请强制您的应用显示登录对话框。

长答案:

Single Single On(SSO) 在 Facebook Android SDK 的 Facebook 类中处理。 Facebook 类 API 没有允许您访问或修改 SSO 过程的方法。

在 Facebook 类中,有四个重载的公共(public)授权方法。其中三个调用第四个:

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);
    }

私有(private) 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;
}

该方法为 com.facebook.katana 包中的类 ProxyAuth 创建了一个显式 Intent ,这是官方 Facebook 应用程序的包。 然后,该方法以 Intent 作为参数调用 validateActivityIntent。如果服务 Intent 解析成功并且 FB 签名匹配,则返回 true。

我们无权访问 ProxyAuth 类源代码,但根据您在问题和评论中描述的观察到的应用程序行为,ProxyAuth 似乎仅在用户登录官方应用程序时完成身份验证过程与您的应用程序相同的帐户。这意味着无法从您的应用程序中区分 1) 未安装官方 FB 应用程序 2) 官方 FB 应用程序未处于登录状态,以及 3) 正在登录另一个帐户。

所以你可以这样做:

  • 检查 FB 应用程序是否未安装或未登录或登录到另一个帐户。
  • 如果是这种情况,请退出您的应用。

但是你不能

  • 验证官方 FB 是否已安装并且处于注销状态。
  • 验证是否安装了官方 FB 应用程序并登录到另一个帐户。

如果您可以按上述操作满足触发注销的需要,则需要编写自己的自定义 Facebook 类来添加新逻辑。 Facebook Android SDK 中的 Facebook 类不扩展抽象类,仅隐式扩展对象,因此您需要将 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 标志,用户将“自动”登录。

关于android - Facebook 单点登录 : when user logs out of Facebook app, 如何退出我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10300600/

相关文章:

android - 如何在android中实现这种按钮结构

Android Facebook 最低 API 级别错误

android - 如何从 Facebook 获取 ParseUser 的名称?

facebook - 如何设置 Facebook webhook 以监控特定页面

Facebook Graph API/{page-id}/posts 限制为每年 600 个帖子

android - Android 应用程序版本控制指南

java - SSLSocket 通过另一个 SSLSocket

android - 如何将构建时间戳写入apk

facebook-graph-api - Facebook Unity3d SDK 不包含 FBUtil 和 GameStateManager 类

ios - 使用 iOS SDK 获取 Facebook 好友在某些好友上返回 null