gpt4 book ai didi

android - AccountManager - authToken 已设置但 peekAuthToken 返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:32 32 4
gpt4 key购买 nike

我正在尝试添加一个新帐户(在 Facebook 登录 + 服务器之后 验证)在 AccountManager 中。这个案例的流程是这样的:

  1. 用户使用 Facebook 登录
  2. 我在登录完成后获得了详细信息,并根据我服务器上的数据对其进行了验证
  3. 如果一切正常,服务器返回一个auth_token(JWT token)
  4. 有了用户的详细信息和 auth_token 我正在通过 AccountManager 创建一个帐户,一旦创建,我就设置了 authToken
  5. 下次登录时,当用户重新打开应用程序时,我调用 getAuthToken,它首先尝试通过调用 peekAuthToken() 获取缓存的 authToken。

问题

在第 5 点,peekAuthToken 返回 null 但它不应该返回,因为我已经为该帐户设置了 autToken。

代码

 public static Bundle handleUserLogin(Context context, User user) {
SharedPreferences mPrefs = context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE);
AccountManager am = AccountManager.get(context);
Account account = new Account(user.getEmail(), ACCOUNT_TYPE);
Account[] accounts = am.getAccountsByType(ACCOUNT_TYPE);
boolean isNewAccount = true;


for (int i = 0; i < accounts.length; i++) {
if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) {
isNewAccount = false;
account = accounts[i];
break;
}
}

if (isNewAccount) {
am.addAccountExplicitly(account, user.getPassword(), null);
accounts = am.getAccountsByType(ACCOUNT_TYPE);

for (int i = 0; i < accounts.length; i++) {
if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) {
account = accounts[i];
break;
}
}
}

if (null != user.getPassword()) {
am.setPassword(account, user.getPassword());
}

Cs.error(TAG, "account " + account + " token " + user.getToken());
am.setAuthToken(account, user.getToken(), Authenticator.AUTHTOKEN_TYPE_FULL_ACCESS);
setUserData(user, account, am);

Bundle result = new Bundle();

result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, user.getToken());
mPrefs.edit().putString(Constants.KEY_CURRENT_USER, account.name).commit();

return result;
}

首先,我认为可能对我的新帐户的引用不正确(例如来自 AccountManager 的那个),所以我再次搜索帐户。

您能否指出我做错了什么,或者我应该如何确保为帐户设置 authToken?

谢谢

最佳答案

我不会依赖于不同于 AbstractThreadedAccountAuthenticator's getAuthToken() 的显式设置 authToken方法。我的猜测是 authToken 在您请求时尚未缓存。

我建议只通过 AccountManager.addAccountExplicitly() 创建帐户并在真正需要时推迟访问 authToken。

AbstractThreadedAccountAuthenticator's getAuthToken()我建议像我刚才创建的项目一样应用逻辑。

  1. 通过 AccountManager.peekAuthToken() 请求 authToken
  2. 如果在缓存中设置了 authToken,则返回它。
  3. 如果没有,则从您的服务器请求它,然后通过 AccountManager.setAuthToken() 缓存并最终返回。

链接:https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

希望这对你有帮助:

https://github.com/dawidgdanski/AccountAuthenticatorExample

关于android - AccountManager - authToken 已设置但 peekAuthToken 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183476/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com