检查Facebook会话是否有效

3

我正在尝试检查Facebook会话是否有效,这可能是因为:

  1. 会话已过期。
  2. 用户已注销。
  3. 用户已删除我的Facebook应用程序。
  4. 用户不再存在。

我有这个方法来检查用户是否仍然登录:

public boolean isLoggedIn() {
    Session session = Session.getActiveSession();
    if (session != null && session.isOpened()) {
        return true;
    } else {
        return false;
    }
}

但是,即使用户从他的Facebook帐户中删除了我的应用程序,它仍会返回true。

当我调用任何Facebook请求时,我会从Facebook获得以下回复:

08-14 12:20:40.671: I/facebookActivity(2322): Result: {Response:  responseCode: 400, graphObject: null, error: {HttpStatus: 400, errorCode: 190, errorType: OAuthException, errorMessage: Error validating access token: User 343343434 has not authorized application 45345345.}, isFromCache:false}

之后我对 Facebook 发出的每个请求都会得到不同的响应:

08-14 12:21:09.707: I/facebookActivity(2322): Result: {Response:  responseCode: 200, graphObject: null, error: {HttpStatus: -1, errorCode: -1, errorType: null, errorMessage: null}, isFromCache:false}

我可以检查JSON中是否存在错误并尝试创建新的Facebook会话,但我想在发出任何Facebook请求之前避免这样做,或者至少在活动启动时调用一次以检查会话是否有效。
有没有一种正常的方法来检查会话是否有效?

我认为新的Facebook SDK很不错,但是它缺乏文档和一些基本方法,需要明确定义的文档和正常的教程,而不是针对片段的教程。 - user1940676
我不知道这个问题的答案,但我建议如果你使用 if (condition) return true else return false,请将其替换为 return condition。所以在你的情况下,只需使用 return (session!=null && session.isOpened()); - Ivo
@IvoBeckers 这只是语义问题,如果有一个检查会话是否有效的条件,那么条件会更长。 - user1940676
1个回答

4
当您从缓存信息中打开会话(通常由系统自动完成)时,不会向Facebook发送任何服务器请求,这就是为什么Session对象本身不知道它是否仍然有效的原因。
唯一知道访问令牌已失效(由于任何原因)的方法是进行图形请求。您可以每次打开新会话时进行图形请求(到 /me 或甚至 /me/permissions),或者您可以像平常一样让您的应用程序运行,并在发生错误时执行此处概述的错误处理步骤(请注意,会话/访问令牌随时可能变得无效-即使在运行您的应用程序的过程中-因此您应该具有适当的错误处理)。

你不能使用 session.getExpirationDate().getTime() < System.currentTimeMillis() 来判断会话是否仍然有效吗? - Adam J
这只是会话无效的许多原因之一(而SDK已经为您检查了)。还有许多其他方式(例如用户更改密码,用户停用其FB帐户等)会导致会话无效,并且在客户端没有办法知道,直到您从服务器获得明确的错误。 - Ming Li

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