2

I'm trying to manage my token expiration with okHttp. So I've read plenty of responses on Internet and they recommand to use okHttp with an Authenticator. So I've created an authenticator :

public class TokenAuthenticator implements Authenticator {

private Context mContext;
private RefreshToken mNewRefreshToken;

public TokenAuthenticator(Context context) {
    this.mContext = context;
}

@Override
public Request authenticate(Route route, final okhttp3.Response response) throws IOException {
    String refreshToken = SharedPreferenceHelper.getSharedPreferenceString(mContext, "refresh_token", null);
    APIService apiService = ServiceGenerator.createAuthenticatedService();
    Call<RefreshToken> call = apiService.refreshToken();
    retrofit2.Response<RefreshToken> responseCall = call.execute();

    // If success, we saved new token to SharedPref and redo a request to the server with new token
    if (responseCall.code() == 200) {
        mNewRefreshToken = responseCall.body();
        SharedPreferenceHelper.setSharedPreferenceString(mContext, "refresh_token", mNewRefreshToken.getRefreshToken());
        SharedPreferenceHelper.setSharedPreferenceString(mContext, "access_token", mNewRefreshToken.getAccessToken());
        return response.request().newBuilder()
                .header("Authorization", "Bearer " + mNewRefreshToken.getAccessToken())
                .build();
    }

    // If refreshToken expired, we logout
    if (responseCall.code() == 401) {
        //todo
        return null;
    }

    return null;
}
}

The problem is even If I return null, it will do a new request again, even if the request is not valid. I want to cancel the request but I haven't find anything about it. Does someone have an idea ?

Thanks you

Foushi
  • 365
  • 1
  • 3
  • 12

0 Answers0