使用单点登录和避免额外对话框的正确方法(Android)



当我通过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());

可能的解决方法是首先使用身份验证密钥调用图形 API,以确保其有效。如果它无效,请如上所述调用 authorize()。如果它有效,就假装我们调用了授权并继续。这感觉像是一个黑客,我认为我应该能够授权()(并使用SSO),而无需进行任何姐妹图形API解决方法。

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

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

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

    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);

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

无论如何,我正在应用程序中使用服务用于其他更合乎逻辑的目的,所以我可以将其作为附加的 benefi,但在您的应用程序中实现服务只是为了扩展令牌可能不是一个好主意......

相关内容

最新更新