Android Retrofit 2.0刷新令牌

我正在使用Retrofit 2.0Jackson转换器与Rest API进行通信。 有些请求需要授权令牌。 如果我拥有的令牌已经过时,我需要用另一个请求刷新它们,并重复上次因此而失败的请求。

我的问题:我是否需要手动每次都做,或者有什么办法来自动化?

以下是我目前实施的方式:

TrackerService

 public interface TrackerService { @POST("auth/sendPassword") Call<ResponseMessage> sendPassword(@Header("app-type") String appType, @Body User userMobile); @FormUrlEncoded @POST("oauth/token") Call<TokenResponse> oathToken(@Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("grant_type") String grantType, @Field("username") String username, @Field("password") String password); @FormUrlEncoded @POST("oauth/token") Call<TokenResponse> refreshToken(@Field("client_id") String clientId, @Field("client_secret") String clientSecret, @Field("grant_type") String grantType, @Field("refresh_token") String username); @PUT("me/profile") Call<Profile> updateProfile(@Header("app-type") String appType, @Header("Authorization") String token, @Body Profile profile); } 

ServiceGateway

 public class ServiceGateway { private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); private static Retrofit retrofit; public static <S> S createService(Class<S> serviceClass) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(20 * 1000, TimeUnit.MILLISECONDS) .writeTimeout(20 * 1000, TimeUnit.MILLISECONDS) .readTimeout(20 * 1000, TimeUnit.MILLISECONDS) .addInterceptor(interceptor).build(); Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(JacksonConverterFactory.create()); retrofit = builder.client(httpClient.build()) .client(client) .build(); return retrofit.create(serviceClass); } public static Retrofit getRetrofit() { return retrofit; } } 

当令牌过期时,我如何调用函数并对其进行处理

  trackerService = ServiceGateway.createService(TrackerService.class); Call<Profile> call = trackerService.updateProfile(getString(R.string.app_type), "Bearer " + userPrefs.accessToken().get(), new Profile(trimedInvitationMessage, title, String.valueOf(selectedCountry.getCountryCode()), mobilePhone, countryISO, fullName)); call.enqueue(new Callback<Profile>() { @Override public void onResponse(Call<Profile> call, Response<Profile> response) { if (response.body() != null) { } else { if (response.raw().code() == 401) { Call<TokenResponse> refreshTokenCall = trackerService.refreshToken(userPrefs.clientId().get(), userPrefs.clientSecret().get(), "refresh_token", userPrefs.refreshToken().get()); refreshTokenCall.enqueue(new Callback<TokenResponse>() { @Override public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) { if (response.body() != null) { updateAdviserProfile(trimedInvitationMessage, title, mobilePhone, countryISO, fullName); } else { userPrefs.clear(); Intent intent = new Intent(WelcomeActivity_.launcher(EditProfileActivity.this)); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); startActivity(WelcomeActivity_.launcher(EditProfileActivity.this)); } } @Override public void onFailure(Call<TokenResponse> call, Throwable t) { } }); } else if (response.raw().code() == 422) } } @Override public void onFailure(Call<Profile> call, Throwable t) { } }); 

Solutions Collecting From Web of "Android Retrofit 2.0刷新令牌"

我从2-3个月前开始search这个主题,发现了OkHttp 's Authenticator 。 你可以使用它。 这里有一个链接: refreshing-oauth-token-using-retrofit-without-modify-all-calls

它的工作方式如下:如果您的请求返回401 ,则Authenticator移入并刷新您的令牌。 但不要忘记return null或放任何尝试限制。 如果不限制,刷新请求失败时会尝试刷新多次,刷新令牌时也会发出同步请求。

另外我有一个问题,也许你会看看它: android-retrofit2-refresh-oauth-2-token

另外:例如,如果你有一个令牌,你需要每3小时刷新一次。 你也可以写一个Interceptor 。 在Interceptor :比较时间并刷新你的令牌,但没有得到任何401响应。

你可以阅读Interceptor页面: OkHttp拦截器

你也可以看看那里: OkHttp处理authentication

我知道这里没有代码,但尝试链接和编辑你的问题,然后我会帮你。