Несколько запросов одновременно не вызываются снова после обновления токена с помощью Authenticator - PullRequest
0 голосов
/ 06 мая 2020

У меня есть MainActivity с 4 вкладками, и мне нужно делать запросы одновременно. Проблема заключается в том, что когда приложение открыто, и если токен истек, он не помещает другой запрос в очередь, если первый запрос получает 401. Я хочу удерживать другой запрос, если первый запрос получает ошибку аутентификации и после refre sh token all request call call again with new Токен доступа. Я синхронизировал метод authenti c, но по-прежнему не работает.

TokenAuthenticator

public class TokenAuthenticator implements Authenticator {


@Nullable
@Override
public synchronized Request authenticate(@Nullable Route route, Response response) throws IOException {
    Log.d("Auth","Entering");
    Context context = App.getmContext();
    SharedPreferenceManager sharedPreferenceManager = SharedPreferenceManager.getInstance(context);
    String client_id = context.getResources().getString(R.string.client_id1);
    final String accessToken = sharedPreferenceManager.getAccessToken();
    final String refreshToken = sharedPreferenceManager.getRefreshToken();
    if (!isRequestWithAccessToken(response) || accessToken == null){
        Log.d("Auth","access null");
        return null;
    }

    synchronized (this){
        final String newAccessToken = sharedPreferenceManager.getAccessToken();
        if (!accessToken.equals(newAccessToken)){
            Log.d("Auth",accessToken);
            Log.d("Auth",newAccessToken);
            Log.d("Auth","diff access token");
            return newRequestWithAccessToken(response.request(),newAccessToken);
        }

        RetrofitClient retrofitClient = new RetrofitClient();
   //     Log.d("header", retrofitClient.client().create(LoginApi.class).refreshToken(refreshToken, "refresh_token").request().toString());
        retrofit2.Response<AccessToken> accessTokenResponse = retrofitClient.client().create(LoginApi.class).refreshToken(refreshToken, "refresh_token",client_id).execute();

        if (accessTokenResponse.isSuccessful()){
            Log.d("Auth","success");
            AccessToken access_Token = accessTokenResponse.body();
            assert access_Token != null;
            String access_token = access_Token.access_token;
            String refresh_token = access_Token.refresh_token;
            sharedPreferenceManager.setAccessToken(access_token, refresh_token);

            return newRequestWithAccessToken(response.request(),access_token);
        }else {
            String error = accessTokenResponse.errorBody().string();
            Log.d("Auth",error);
            Log.d("Auth","null");
            return null;
        }
    }
}

private boolean isRequestWithAccessToken(Response response){
    String header = response.request().header("Authorization");
    return header != null && header.startsWith("Bearer");
}

@NonNull
private Request newRequestWithAccessToken(@NonNull Request request,@NonNull String access_token){
    return request.newBuilder()
            .header("Authorization", "Bearer " + access_token)
            .build();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...