Android-Retrofit 2.0 Refresh Token
Ich bin mit Retrofit 2.0
mit Jackson
Konverter für die Kommunikation mit einer Rest-API. Einige der Anfragen erfordern eine Token auf Genehmigung. Wenn die Token, die ich habe sind out-of-date, ich brauche zu aktualisieren, Sie mit einer weiteren Anforderung, und wiederholen Sie die Letzte Anforderung ist fehlgeschlagen, weil es.
Meine Frage: muss ich es manuell tun, jedes mal, oder gibt es eine Möglichkeit, automatisiert man das ?
Hier ist die Art, wie ich es umsetzen im moment:
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;
}
}
, Wie ich die Funktion aufrufen und behandeln Sie es, wenn Token sind out-of-date
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) {
}
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suchte ich dieses Thema seit 2-3 Monaten und fand
OkHttp 's Authenticator
. Sie können es verwenden,. Es ist ein link hier: erfrischend-oauth-token-mit-retrofit-ohne-ändern-alle-AnrufeFunktioniert so: Wenn deine Anfrage zurück
401
, dannAuthenticator
bewegt sich in, und erfrischt Ihre token. Aber vergessen Sie nichtreturn null
oder irgendwelche versuche zu begrenzen. Wenn Sie nicht einschränken, es wird versuchen, zu aktualisieren mehrmals, wenn Sie Ihre refresh-Anforderung schlägt fehl, und auch synchrone Anfragen beim regenerieren von auf dem token.Habe auch ich ein Frage-und Antwort -sowohl von mir selbst geschrieben über die Suche diese links - über erfrischend Oauth2-token, werden Sie vielleicht einen Blick drauf werfen:
Frage: android-retrofit2-refresh-oauth-2-token
Antwort: android-retrofit2-refresh-oauth-2-token-Antwort
Zusätzlich: zum Beispiel, wenn Sie ein token, und Sie müssen, um es zu aktualisieren, - pro 3 Stunden. Sie können schreiben, eine
Interceptor
zu. InInterceptor
: vergleichen Sie die Zeit und erfrischen Sie Ihren token, ohne irgendwelche401
Antwort.Lesen Sie
Interceptor
Seite: OkHttp AbfangjägerKönnen Sie einen Blick auf es zu: OkHttp handling-Authentifizierung
Ich weiß, es gibt keinen code hier, aber versuchen Sie, links und Bearbeiten Sie Ihre Frage dann werde ich Euch helfen.