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 类中,有四个重载的公共授权方法。其中三个称第四个:

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 应用程序是否可以管理 Auth 过程:

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 创建显式意图,该包是官方 Facebook 应用程序包。然后该方法以意图作为参数调用 validateActivityIntent。如果服务意图解析成功并且 FB 签名匹配,则返回 true。

我们无权访问 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 时,您将获得为您的 appid 分配的 access_token,过期时间为 ca.2 小时(如果您不要求 offline_access 权限)。

-- 如何检查你的token的有效性?最简单的方法是使用 HTTP GET 将我的个人资料加载到

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

如果您的令牌无效,响应将清楚地告诉您

-- 如何使你的令牌失效(又名注销)?您可以对该端点进行 HTTP GET 调用,请参见示例

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 回答