如何从 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的主要内容,如果未能解决你的问题,请参考以下文章