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

时间:2012-04-24 15:00:42

标签: android facebook facebook-graph-api

我对Facebook SDK for Android感到非常惊讶 - 有效使用它非常具有挑战性。据我了解,这些是单点登录的规则:

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

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

3 个答案:

答案 0 :(得分: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);
    }

private 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应用程序包。 然后,该方法将intentActivityIntent作为参数调用。如果服务意图解析成功发生且FB签名匹配,则返回true。

我们无权访问ProxyAuth类源,但根据您在问题和评论中描述的观察到的应用行为,似乎ProxyAuth仅在用户登录官方应用程序时才完成身份验证过程与您的应用相同的帐户。这意味着没有办法distingush - 从你的应用程序 - 1)官方FB应用程序没有安装2)官方FB应用程序没有登录状态,3)它登录到另一个帐户。

所以你可以这样做:

  • 检查FB app是否未安装或未登录或是否已登录到其他帐户。
  • 如果是这种情况,请退出您的应用。

但你不能

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

如果您 按照上述方式执行的操作符合您触发退出的需求,则需要编写自己的自定义Facebook类来添加新逻辑。 Facebook Android SDK中的Facebook类不会隐式扩展抽象类,只扩展Object,因此您需要将Facebook代码复制到CustomFacebook类中并修改它以添加强制注销的代码。

供参考:

旧答案

我不确定这会回答您的问题但是要强制用户使用Facebook Android SDK注销,请在auth / login期间调用authorize()时使用FORCE_DIALOG_AUTH标志,如下所示:

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

其中mFacebook是SDK的Facebook类的实例,而LoginDialogListener实现了DialogListener。

如果用户退出,则下次用户想要登录或启动应用时,将显示登录对话框。

如果您未设置FORCE_DIALOG_AUTH标记,则用户将“自动”登录。

答案 1 :(得分:1)

很少有评论,希望这会有所帮助。

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

简单;当您完成SSO时,您将为appid分配access_token,过期时间约为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>

答案 2 :(得分:0)

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

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