0

我正在尝试将我的 Android 应用从 Facebook SDK 2.0(异步 API)更新到新的 SDK 3.0。Facebook 不是此应用程序中唯一的身份验证方法。该应用程序的先前版本将 Facebook access_token 存储在 SharedPreferences 中。我正在尝试设置一个涵盖所有可能的身份验证案例的工作流程,但文档并不完整。

Session session = null;

//already authenticated in another Activity, so reuse session:
session = Session.getActiveSession(getApplicationContext())

//app resumed/rotated, so reopen session:
if (session == null) {
    session = Session.openActiveSessionFromCache(getApplicationContext())
}

if (session == null) {
    session = new Session(getApplicationContext());

    //access_token from SDK 2.0 (async API), stored in SharedPreferences
    if (myPreferences.getFacebookToken != null) {
        AccessToken access_token = AccessToken.createFromExistingAccessToken(myPreferences.getFacebookToken(), null, null, null, null);
        session.open(access_token, new Session.StatusCallback(){
                @Override
                public void call(Session session, SessionState state, Exception exception) {
                    if (session.isOpened()) {
                        myPreferences.deleteFacebookToken();
                    }
        });
    }
}

//user previously logged in (app restarted), or SSO
if (!session.isOpen()) {
    session.openForRead(new Session.OpenRequest(getApplicationContext()).setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK));
}

Session.setActiveSession(session);
Request.newMeRequest(session, ... // etc

我相信这涵盖了我的应用程序中 Facebook 的所有身份验证案例。我想知道的是如何最好地确定我的用户是否是 facebook 用户,以便首先调用此代码?我可以检测到以前用户的 SDK 2.0 access_key,但新用户将没有有效的会话供我检查。如果用户有 SSO,或者如果 Session 对象已经有他们的访问令牌,我想登录没有交互的用户,但如果用户选择了另一种登录身份验证机制,则不运行任何此操作。如果没有访问令牌(在不使用 Facebook 登录的用户的情况下),似乎 Session 对象的检查将弹出 FB 登录。

4

1 回答 1

1

首先是关于您的代码的评论:您根本不需要执行 if (myPreferences.getFacebookToken) 块。SDK 已经为您存储了访问令牌,并将使用存储的数据(如果可用)。您不需要将其显式传递给 Session。

现在,回答你的问题。调用 openActiveSessionFromCache 几乎正是您正在寻找的。如果用户之前已经通过 facebook 授权,并且您没有调用 closeAndClearTokenInformation,那么调用 openActiveSessionFromCache 将他们安静地登录。因此,如果您从该调用中获得非空 Session,那么您就知道他们是 Facebook 用户,并且他们已经授权您的应用程序。如果你得到一个空会话,那么他们还没有验证你的应用程序,你应该向他们展示所有的登录选项。

于 2013-05-28T16:45:47.540 回答