0

当我通过我的 Android 应用程序登录到 FB 时,我向 Facebook 对象(在不到 5 分钟前创建)提供了最后一个有效的身份验证密钥和到期日期,期望能够登录。

相反,我收到一个对话框,指出“您已授权此应用程序”。这显然是一种糟糕的用户体验,我想尽我所能让用户在没有这个的情况下登录。

我的登录流程是

  • 设置最后一个有效的身份验证密钥和过期时间
  • 调用授权()
  • 成功后,我将此身份验证密钥发送到服务器,服务器会通过 FB 图形 API 验证该密钥是否有效。

这是我如何称呼它的简化:

Facebook m_facebook;
int ACTIVITY_CODE_FACEBOOK_AUTH = 1;
// auth key and expiration are set from a previous login
m_facebook.setAccessToken(accessToken);
m_facebook.setAccessExpires(expirationTime);
// permissions contains publish_stream, publish_actions, email and does not change.
m_facebook.authorize(m_activity, permissions, ACTIVITY_CODE_FACEBOOK_AUTH, new AppLoginListener());

一种可能的解决方法是首先使用 auth 密钥调用 Graph API 以确保其有效。如果它无效,请按上述方法调用 authorize()。如果它是有效的,就假装我们调用了授权并继续。这感觉就像是一个 hack,我认为我应该能够授权()(并使用 SSO),而无需使用任何姊妹的 Graph API 变通方法。

  • 我正在使用 FB SDK rom 2012/4/4。从那时起,似乎没有任何相关的变化。
  • 一年前我看到过与此类似的问题,但我还没有看到解决我的问题的具体答案,也没有看到与我已经在做的不同的解决方案。
4

1 回答 1

-1

老实说,我不知道最近流程是否发生了变化,我只能说我使用它的方式不同,这对我有用。

  • 检查是否存在授权令牌(我将我的存储在首选项中)
  • 检查它是否仍然有效
  • 只有当两个条件之一不满足时,才需要(再次)授权

    private SharedPreferences prefs = getSharedPreferences("APP_Preferences", MODE_PRIVATE); 
    Facebook facebook = new Facebook("app_number");
    
    if (!facebook.isSessionValid() || !prefs.contains("fb_access_token")){
        loginToFacebook();              
    }else{
        //do something else
    }
    

此外,我确保令牌在后台扩展,因此通过调用几乎所有时间都可以使用有效令牌:

    facebook.extendAccessTokenIfNeeded(context, null);

在我的应用程序的后台服务中。这可以确保即使用户几天没有打开我的应用程序,令牌也始终有效且最新,因此当用户在一段时间后打开应用程序时不会发生烦人的授权请求。我认为此流程将帮助您解决问题。

无论如何,我在应用程序中使用服务用于其他更合乎逻辑的目的,所以我可以这样做作为额外的好处,但在你的应用程序中实现服务只是为了扩展令牌可能不是一个好主意......

于 2012-06-16T06:39:17.520 回答