gpt4 book ai didi

Android OAuth2 Bearer token 最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:45 25 4
gpt4 key购买 nike

This nice tutorial很好地介绍了 Android 上的帐户身份验证,并通过使用 Android 的 AccountManager 来实现。 .

但是,我需要使用不记名 token 为 OAuth2 API 创建客户端应用程序以进行身份​​验证。在获取 token 时,我收到了它的到期时间戳,但我不清楚存储在哪里以及如何正确使用它。问题是,如果我不想不必要地访问服务器,应用程序只有在请求任何随机资源时从服务器收到 HTTP 401 错误后才会意识到 Bearer 已经失效。那么,解决这个问题的最佳做法是什么:

  1. 我的代码中的每个网络请求都应该有重试机制以防不记名 token 同时失效吗?我可能会 invalidateAuthToken捕获异常并重试时。
  2. 可以Sync Adapter以某种方式在这里提供帮助?

由于我是 Android 开发的新手,我希望解决方案也可能与我预期的完全不同。

如果相关,我打算使用 Volley用于服务器通信。

最佳答案

经过一番调查,我找到了自己的答案:

  1. 是的,调用 AccountManager#invalidateAuthToken 会删除上次保存的身份验证 token (在 OAuth2 情况下是访问 token ),并期望您在下一个 AccountAuthenticator#getAuthToken 调用。例如,以下是我对该方法的代码:

    @Override
    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
    // Extract the username and password from the Account Manager, and ask
    // for an appropriate AuthToken.
    final AccountManager am = AccountManager.get(mContext);

    String authToken = am.peekAuthToken(account, authTokenType);

    // EXTRA: I am also storing the OAuth2 refresh token in the AccountManager
    Map<String, String> refreshResult = null;
    String refreshToken = am.getUserData(account, KEY_REFRESH_TOKEN);
    if (TextUtils.isEmpty(authToken) && !TextUtils.isEmpty(refreshToken)) {
    // lets try to refresh the token
    // EXTRA: AuthenticationProvider is my class for accessing the authentication server, getting new access and refresh token based on the existing refresh token
    refreshResult = AuthenticationProvider.
    refreshAccessToken(am.getUserData(account, KEY_REFRESH_TOKEN));
    }

    // If we get a result from the refresh - we return it
    if (!refreshResult.isEmpty()) {
    authToken = refreshResult.get(AccountManager.KEY_AUTHTOKEN);
    // EXTRA: new refresh token used only in OAuth2
    refreshToken = refreshResult.get(KEY_REFRESH_TOKEN);

    final Bundle result = new Bundle();
    result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
    result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);

    // store the new tokens in the system
    am.setAuthToken(account, authTokenType, authToken);
    am.setUserData(account, KEY_REFRESH_TOKEN, refreshToken);

    result.putString(AccountManager.KEY_AUTHTOKEN, refreshResult.get(AccountManager.KEY_AUTHTOKEN));
    result.putString(KEY_REFRESH_TOKEN, refreshResult.get(KEY_REFRESH_TOKEN));
    return result;
    }

    // If we get here, then we couldn't access the user's password - so we
    // need to re-prompt them for their credentials. We do that by creating
    // an intent to display our AuthenticatorActivity.
    final Intent intent = new Intent(mContext, LoginActivity.class);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
    }

    我还收到了 confirmation from the author of the blog post问题中提到。

  2. SyncAdapter 不能直接提供帮助,因为它们的真正目的是以异步方式(对于开发人员)和透明方式(对于用户)从网络获取数据。他们只是使用 AbstractAccountAuthenticator 并在适当的地方调用它的方法。

关于Android OAuth2 Bearer token 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642153/

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