1

これまでのところ、アカウントを追加してトークンなどを取得できます。問題は、資格情報サーバー側を変更するときです。

資格情報が変更された場合にサーバーから通知を受け取ることができないため、トークンが有効でなくなったため、次の API 要求は拒否されます。

リクエストが拒否された後、2 つの理由が考えられます -> トークンの有効期限が切れているか、資格情報が無効になっています

これが発生すると、保存されたトークンを無効にして getAuthToken() を呼び出します

私の getAuthToken() では、最初に新しいトークンのリクエストを試みます。拒否された場合は、資格情報がもう問題ないことを意味するため、ログイン アクティビティを促す必要があります。問題は、 AccountAuthenticatorResponse.onError がエラーをログに記録することしかできないようで、それだけです。ログイン アクティビティの KEY_INTENT を含むバンドルを渡す AccountAuthenticatorResponse.onResult を使用しようとしましたが、何もしません。何かご意見は?

@Override
public Bundle getAuthToken(final AccountAuthenticatorResponse authenticatorResponse, final Account account,
                           final String authTokenType, Bundle bundle) throws NetworkErrorException {

    //Get the account manager to access the account details
    final AccountManager accountManager = AccountManager.get(mContext);
    String authToken = accountManager.peekAuthToken(account, authTokenType);

    //If auth token is null then try to log in the user with the stored credentials
    //It could be that previous token has expired
    if (authToken == null) {
        final String password = accountManager.getPassword(account);
        final String clientID = accountManager.getUserData(account, CLIENT_ID_KEY);
        final String apiSecret = accountManager.getUserData(account, API_SECRET_KEY);
        final String serverUrl = accountManager.getUserData(account, SERVER_ADDRESS_KEY);

        if (password != null && clientID != null && apiSecret != null && serverUrl != null) {
            Logger.log(LOG_TAG, "Requesting new token...", Log.VERBOSE);
            ApiRequestManager.getInstance(mContext)
                    .getToken(serverUrl, clientID, apiSecret, account.name, password,
                            new NetworkCallBack() {
                                @Override
                                public void tokenReceived(Token JsonToken) {
                                    //Credentials still valid, token received
                                    //Returning data back to the account authenticator
                                    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, JsonToken.getAccess_token());
                                    authenticatorResponse.onResult(result);
                                }

                                @Override
                                public void errorReceivingToken(VolleyError errorResponse) {
                                    //If we are here with error 400 it only means credentials have changed
                                    //I should prompt LogIn activity at this point
                                    if (errorResponse.networkResponse.statusCode == 400) {
                                        Bundle loginActivityBundle =
                                                promptLoginActivity(authenticatorResponse, account.type, authTokenType, null);

// AuthenticatorResponse.onResult(loginActivityBundle); AuthenticatorResponse.onError(errorResponse.networkResponse.statusCode、「エラー」);

                                    }
                                }
                            });
            return null;
        }
    }

    //If we got an authToken return the account and login info in a bundle
    if (authToken != null) {
        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, authToken);

        return result;
    }

    //If we are here then means either we do not have an account signed
    //or credentials are no longer valid -> prompt login procedure again
    return promptLoginActivity(authenticatorResponse, account.type, authTokenType, null);
}
4

1 に答える 1