Добавление токена аутентификации JWT в OkHttp, Dagger 2 и Retrofit

63
6

следующий пост Dagger + Retrofit. Добавляя заголовки аутентификации во время выполнения, я пытаюсь настроить okHttp и добавить ключ аутентификации jwt в okHttp, добавив перехватчик, для этого я создал отдельный перехватчик и добавил его в компонент Dagger, чтобы его можно было выставить где угодно.

Теперь, когда я нажимаю на логин, я получаю токен, устанавливая его с помощью метода setJwtToken() класса JwtAuthenticationInterceptor, и когда я пытаюсь использовать следующие конечные точки, я получаю ошибку 401, поскольку jwtToken приходит в ноль, даже если я его установил.

Ниже я прикрепляю свой перехватчик, код компонента и модуля привязывается.

модуль

@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(provideHeaderInterceptor());
client.cache(cache);
return client.build();
}

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(mBaseUrl)
.client(okHttpClient)
.build();
}

@Provides
@Singleton
JwtAuthenticationInterceptor provideHeaderInterceptor(){
return new JwtAuthenticationInterceptor();
}

Составная часть

@Component(modules = {AppModule.class, ApiModule.class, StorageModule.class})
@Singleton
public interface NetComponent {
Retrofit retrofit();
OkHttpClient okHttpClient();
SharedPreferences sharedPreferences();
Gson gson();
Cache cache();
KRITILog log();
JwtAuthenticationInterceptor headerInterceptor();
}

JwtAuthenticationInterceptor.java

@Singleton
public class JwtAuthenticationInterceptor implements Interceptor {
private String jwtToken;

@Inject
public JwtAuthenticationInterceptor() { }

public void setJwtToken(String jwtToken) {
this.jwtToken = jwtToken;
}

@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();

Request.Builder builder = original.newBuilder()
.header("Authorization","Bearer " +jwtToken);
//String.format("Bearer %s", jwtToken));

Request request = builder.build();
return chain.proceed(request);
}
}

спросил(а) 2021-01-25T17:10:31+03:00 4 месяца, 4 недели назад
1
Решение
63

проблема в этой линии

client.addInterceptor(provideHeaderInterceptor());

там вы создаете новый экземпляр JwtAuthenticationInterceptor, отличный от того, который предоставляет dagger. JwtAuthenticationInterceptor должен быть зависимостью этого метода. Например

@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache, JwtAuthenticationInterceptor interceptor) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(interceptor);
client.cache(cache);
return client.build();
}

ответил(а) 2021-01-25T17:10:31+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема