Facebook单点登录:当用户注销Facebook应用程序时,我如何注销我的应用程序?

9
我对Facebook SDK for Android感到非常惊讶——它很难有效地使用。据我所知,这是单点登录的规则:
  • 如果用户安装了Facebook应用程序并使用SDK登录第三方应用程序,则Facebook应用程序也会登录
  • 如果用户使用SDK退出第三方应用程序,则Facebook应用程序仍然登录(可能是最好的)
  • 如果用户退出Facebook应用程序,则使用SDK的第三方应用程序不受影响
在使用Facebook SDK的Android应用程序中,有没有一种方法可以检查并查看官方Facebook应用程序是否未登录与Android应用程序使用的相同帐户,如果是这种情况,则注销Android应用程序...换句话说,如果您进入Facebook应用程序并退出登录,然后转到第三方应用程序,则它将退出登录?
3个回答

7

更新的回答

在使用Facebook SDK的Android应用程序中,有没有一种方法可以检查并查看官方Facebook应用程序是否未登录与Android应用程序使用相同的帐户。如果是这种情况,则退出Android应用程序...

如果我理解正确,您是在询问我们是否可以:

  • 从您的应用程序中检查官方Android应用程序是否安装
  • 如果已安装,则检查它是否已登录到与您的应用程序相同的帐户
  • 如果官方应用程序未登录到您的帐户中,则退出您的应用程序

简短的答案:不能。但您可以通过编写自己的Facebook类来实现。

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

长答案:

单点登录(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 应用程序是否能够管理身份验证过程:
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类源代码,但根据您在问题和评论中描述的观察到的应用程序行为,似乎只有当用户在官方应用程序上登录到与您的应用程序相同的帐户时,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标志,则用户将被“自动”登录。


Gunnar,如果我的应用程序使用Facebook SDK和Single-Sign On,并使用您的建议进行注销,那么是否也会注销在同一设备上登录到相同帐户的官方Facebook应用程序? - Chad Schultz
不,只有你的应用程序。它会强制在使用标志的应用程序中重新出现对话框,而不是其他应用程序。 - Gunnar Karlsson
非常好的、非常详细的信息,Gunnar!非常感谢。 - Chad Schultz

1

几点评论,希望这能有所帮助。

鉴于Facebook应用是主应用程序,您(或其他人)的应用程序的登录/注销操作不会产生任何影响。 您的应用程序通过SSO流程获得自己的访问令牌,并且这不会与主应用程序产生任何联系。

简单来说,完成SSO后,您将获得为您的appid分配的访问令牌,有效期约为2小时(如果您没有请求offline_access权限)。

-- 如何检查您的令牌的有效性? 最简单的方法是使用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>

很抱歉,WareNinja,但你是错误的。我刚刚测试了一下,你应该能够使用Facebook SDK和Facebook应用程序中的任何第三方Android应用程序验证这些结果。登录Facebook应用程序,然后转到第三方应用程序--您不需要登录Facebook。从Facebook应用程序注销,然后通过第三方应用程序登录?然后Facebook应用程序就被签入了。这就是为什么它被称为“单点登录”。问题在于,要完全注销,您必须注销Facebook应用程序和第三方应用程序;我正在寻找解决方案。 - Chad Schultz
并非完全如此,@Maid786,但是Facebook SDK的3.0版本已经改变了一切——我还没有进行广泛的测试来查看这个新SDK现在的工作方式,但所有旧信息都已过时。 - Chad Schultz

0

1)检查官方FB应用是否已安装非常简单。如果已安装,则facebook.authorize(blah,blah,blah)将在您的应用程序内带您进入登录屏幕,否则它将切换到Webview进行授权。

2)您可以尝试从共享首选项中获取access_token并检查是否存在,然后在注销时尝试清除它。


问题是这样的:在我的应用程序中使用Facebook授权时,我如何知道官方Facebook应用程序已经注销?您的(1)描述了如何登录,而(2)听起来像是我的应用程序可以注销的替代方法。或者您是在说任何第三方应用程序都可以访问和修改官方Facebook应用程序的共享首选项吗?这对我来说似乎非常不可能,但如果是这样,我希望能获得更多详细信息。 - Chad Schultz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接