【问题标题】:remove Account or invalidate auth token when logging out from app?从应用程序注销时删除帐户或使身份验证令牌无效?
【发布时间】:2014-03-31 12:42:50
【问题描述】:

我在我的应用程序中使用 android AccountManager。在初始屏幕中,我调用getTokenForAccountCreateIfNeeded获取身份验证令牌或显示登录屏幕,它没有帐户存在于应用程序中。

private void getTokenForAccountCreateIfNeeded(String accountType, String authTokenType) {
    final AccountManagerFuture<Bundle> future = mAccountManager.getAuthTokenByFeatures(accountType, authTokenType, null, this, null, null,
            new AccountManagerCallback<Bundle>() {
                @Override
                public void run(AccountManagerFuture<Bundle> future) {
                    Bundle bnd = null;
                    try {
                        bnd = future.getResult();
                        final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
                        LogUtils.ShowToast(SplashScreen.this, authtoken);
                        if(authtoken!=null)
                        {
                            goToHomePage();
                        }

                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                }
            }
    , null);
}

当按下注销时,我会打电话

AccountManager manager = AccountManager.get(HomeActivity.this);
            manager.invalidateAuthToken(Constants.CONTENT_AUTHORITY,preferences.getString(Constants.AUTH_TOKEN,""));

删除 authToken。并且身份验证令牌被删除。

现在,当我返回启动画面并调用 getTokenForAccountCreateIfNeeded 时,它会返回一个空包。所以当访问令牌为空时,什么都不会发生。

我应该在用户注销时删除帐户,还是应该在访问令牌为空时调用其他方法来显示登录页面。如果我应该调用一些其他方法,那么请告诉调用哪个方法来显示登录。

【问题讨论】:

  • 抱歉我的无知,但如果访问令牌为空,我认为您错过了导航到登录页面的代码的其他部分。

标签: android accountmanager


【解决方案1】:

这取决于您想要的确切行为。保留没有身份验证令牌的帐户的原因是什么?我想到的只有使用存储凭据的即时重新身份验证。您可以在 Authenticator 的 getAuthToken() 方法中实现逻辑。否则,您应该删除该帐户,以便用户知道他已注销并且必须再次输入登录名/密码。

【讨论】:

    【解决方案2】:

    通常你的AccountAuthenticator 应该在getAuthToken(...) 中返回一个带有登录活动的 Intent,如果它无法获得 Auth-Token。请检查您的实现(示例在最后)。

    删除帐户可能会删除任何关联的数据。例如,删除联系人帐户将删除分配的RawContacts。这就是为什么我认为如果用户再次使用该帐户,最好保留该帐户。

    @Override
    public Bundle getAuthToken(...) {
       // get Auth Token and return Bundle with AuthToken...
       // otherwise
       return startLoginView(...)
    }  
    
    private Bundle startLoginView(AccountAuthenticatorResponse response) {
        final Intent intent = new Intent(mContext, YourLoginActivity.class);
        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
                response);
        final Bundle bundle = new Bundle();
        bundle.putParcelable(AccountManager.KEY_INTENT, intent);
        return bundle;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2015-07-02
      • 2017-10-03
      • 2021-02-03
      相关资源
      最近更新 更多