Okhttp refresh expired token when multiple requests are sent to the server

前端 未结 4 1283
北荒
北荒 2021-01-30 13:14

I have a ViewPager and three webservice calls are made when ViewPager is loaded simultaneously.

When first one returns 401, Authenticato

4条回答
  •  心在旅途
    2021-01-30 14:18

    I found the solution with authenticator, the id is the number of the request, only for identification. Comments are in Spanish

     private final static Lock locks = new ReentrantLock();
    
    httpClient.authenticator(new Authenticator() {
                @Override
                public Request authenticate(@NonNull Route route,@NonNull Response response) throws IOException {
    
                    Log.e("Error" , "Se encontro un 401 no autorizado y soy el numero : " + id);
    
                    //Obteniendo token de DB
                    SharedPreferences prefs = mContext.getSharedPreferences(
                            BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
    
                    String token_db = prefs.getString("refresh_token","");
    
                    //Comparando tokens
                    if(mToken.getRefreshToken().equals(token_db)){
    
                        locks.lock(); 
    
                        try{
                            //Obteniendo token de DB
                             prefs = mContext.getSharedPreferences(
                                    BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
    
                            String token_db2 = prefs.getString("refresh_token","");
                            //Comparando tokens
                            if(mToken.getRefreshToken().equals(token_db2)){
    
                                //Refresh token
                                APIClient tokenClient = createService(APIClient.class);
                                Call call = tokenClient.getRefreshAccessToken(API_OAUTH_CLIENTID,API_OAUTH_CLIENTSECRET, "refresh_token", mToken.getRefreshToken());
                                retrofit2.Response res = call.execute();
                                AccessToken newToken = res.body();
                                // do we have an access token to refresh?
                                if(newToken!=null && res.isSuccessful()){
                                    String refreshToken = newToken.getRefreshToken();
    
                                        Log.e("Entra", "Token actualizado y soy el numero :  " + id + " : " + refreshToken);
    
                                        prefs = mContext.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
                                        prefs.edit().putBoolean("log_in", true).apply();
                                        prefs.edit().putString("access_token", newToken.getAccessToken()).apply();
                                        prefs.edit().putString("refresh_token", refreshToken).apply();
                                        prefs.edit().putString("token_type", newToken.getTokenType()).apply();
    
                                        locks.unlock();
    
                                        return response.request().newBuilder()
                                                .header("Authorization", newToken.getTokenType() + " " + newToken.getAccessToken())
                                                .build();
    
                                 }else{
                                    //Dirigir a login
                                    Log.e("redirigir", "DIRIGIENDO LOGOUT");
    
                                    locks.unlock();
                                    return null;
                                }
    
                            }else{
                                //Ya se actualizo tokens
    
                                Log.e("Entra", "El token se actualizo anteriormente, y soy el no : " + id );
    
                                prefs = mContext.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
    
                                String type = prefs.getString("token_type","");
                                String access = prefs.getString("access_token","");
    
                                locks.unlock();
    
                                return response.request().newBuilder()
                                        .header("Authorization", type + " " + access)
                                        .build();
                            }
    
                        }catch (Exception e){
                            locks.unlock();
                            e.printStackTrace();
                            return null;
                        }
    
    
                    }
                    return null;
                }
            });
    

提交回复
热议问题