如何从 Android 上保存的帐户中检索 Facebook-AuthToken

Posted

技术标签:

【中文标题】如何从 Android 上保存的帐户中检索 Facebook-AuthToken【英文标题】:How to retrieve an Facebook-AuthToken from the accounts saved on Android 【发布时间】:2011-06-03 08:16:59 【问题描述】:

我正在尝试使用以下代码检索 Facebook 的 AuthToken(由 Android 版 Facebook 保存)。

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType("com.facebook.auth.login");
if (accounts.length > 0)           
    for(int j = 0; j < accounts.length; j++) 
        Account account = accounts[j];
        if(account.type != null && account.type.equals("com.facebook.auth.login"))  
            Log.e(RuntimeVars.MY_NAME, "FACEBOOK-TYPE FOUND");
            am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this,
                new AccountManagerCallback<Bundle>() 
                    public void run(AccountManagerFuture<Bundle> arg0) 
                        try 
                            Bundle b = arg0.getResult();
                            Log.e(RuntimeVars.MY_NAME, "THIS AUTHTOKEN: " + b.getString(AccountManager.KEY_AUTHTOKEN));
                        
                        catch (Exception e) 
                            Log.e(RuntimeVars.MY_NAME, "EXCEPTION@AUTHTOKEN");
                        
                    
                , null);
            
        
    

登录凭据已找到,FACEBOOK-TYPE FOUND 已写入 LogCat,但 THIS AUTHTOKEN: [...]EXCEPTION@AUTHTOKEN 已记录。所以我想am.getAuthToken 永远不会被调用。

我错过了什么?

一般来说,如果有更好(并且至少有效)的方法可以从 android 帐户中检索 Facebook authtoken,请告诉我。

非常感谢您的帮助!

最好的问候 S.

【问题讨论】:

【参考方案1】:

为什么不使用 Facebook SDK?

其中的Facebook 类有一个成员来获取OAuth 2.0 访问令牌(如果您需要的话),getAccessToken()

【讨论】:

如果使用 Facebook SDK,AFAIK 用户需要输入他们的 Facebook 凭据。但是这些凭据应该已经可以通过 Accounts 提供程序获得,我想... 它们应该是,但可能会受到限制,以防止 Android 应用在未经明确许可的情况下访问用户的数据。我肯定会建议使用此解决方案(必要时提示输入密码),如果您找到使用 AccountsManager 的方法,请稍后替换。 AFAIK - Facebook Android SDK 返回一个仅在 1 小时内有效的身份验证令牌。这意味着用户每次想要访问他们的 FB 帐户时都需要使用他们的 SDK OAUth 接口重新登录。 如果您需要一个长期存在的令牌,您应该请求offline_access 权限。此权限使 OAuth 端点返回的访问令牌长期有效。请参阅developers.facebook.com/docs/authentication/permissions 了解更多信息。 @Olle 现在不推荐使用offline_access 权限developers.facebook.com/roadmap/offline-access-removal【参考方案2】:

要解释您的任何一个日志语句都没有到达的事实,请考虑:

第~8行:

        am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this,

... 如果令牌立即可用,则可以返回它。也许这就是您正在寻找的答案?引用 AccountManager 文档:

如果之前生成的身份验证令牌 已为此帐户和类型缓存, 然后它被退回。否则,如果一个 保存的密码可用,它是 发送到服务器以生成新的 授权令牌。否则,用户是 提示输入密码。

【讨论】:

感谢核磁共振。但我必须说,我真的不明白为什么这应该解释什么都没有发生。 :-s 在我看来,也没有生成新的身份验证令牌,也没有要求我输入密码... 如果我理解正确,什么都没有发生,因为您没有保存 getAuthToken 的结果。我提出的解释意味着您必须执行以下操作:AccountManagerFuture amf = am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this, ..... ); 目前您正在丢弃返回值,在此示例中为“amf”。相反,存储它,如果它不为空,则从中检索身份验证令牌。无论如何,这就是我的意思,不确定这是否是实际发生的事情。【参考方案3】:

请尝试致电 AccountManager.blockingGetAuthToken。如果这行得通,那么这里有一些更有趣的错误......

另外,请确保您的清单正确设置了 USE_CREDENTIALS 权限。

【讨论】:

返回 null。你有关于 authTokenTypes 的任何信息吗?我只假设 facebook 类型的名称是“com.facebook.auth.login”,但我无法验证。 这是首先要确认的。我会尝试调用AccountManager.getAccountsByType(null) 来检索所有帐户,然后从那里开始改进您的代码。希望返回的帐户数据包含您需要的信息。它可能根本不会暴露。 显然对于 Google auth authTokenTypes 字符串应该是“ah”。不知道人们是如何确定的,但不幸的是,对于 Facebook,我猜这同样是任意的。 其实我知道Google的AccountType是“com.google”,TokenType是“ah”,对吧。 Facebook 的 AccountType 肯定是“com.facebook.auth.login”,但没有可用于 Facebook TokenType 的信息。而且我不知道如何检索所有可用的 TokenTypes。 :( @dave 如果可以的话,请尝试帮助 sota【参考方案4】:

在 am.getAuthToken 之前添加 try 并在此方法声明结束处捕获异常。这将为您提供异常发生的原因和位置

【讨论】:

没有抛出异常。如果我把这个 am.getAuthToken 放在一个 try 中,一切都会运行。什么都没抓到。

以上是关于如何从 Android 上保存的帐户中检索 Facebook-AuthToken的主要内容,如果未能解决你的问题,请参考以下文章

如何从自定义帐户中检索联系方式?

从 iCloud 帐户保存和检索 NSArray 的存储库

如何从 Android Studio 中检索已保存的密钥库密码?

如何使用 Angularjs 将数据存储在本地存储中?

Android从谷歌帐户检索用户国家

如何从 Firebase 检索用户数据 android