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