将 JWT 身份验证令牌添加到 OkHttp、Dagger 2 和 Retrofit
Adding JWT authentication token to the OkHttp , Dagger 2 & Retrofit
以下 post 我正在尝试配置 okHttp 并通过添加拦截器将 jwt auth 密钥添加到 okHttp,为此我创建了单独的拦截器并将其添加到 Dagger 的组件,以便它可以暴露在任何地方。
现在,一旦我点击登录,我就获得了令牌,使用 JwtAuthenticationInterceptor 的 setJwtToken() 方法设置它 class & 当我尝试使用下一个端点时,我收到 401 错误,因为 jwtToken 是即使我已经设置了它,它也会变成 null。
下面附上我的拦截器、组件和模块代码快照。
模块
@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);
}
}
问题出在这一行
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();
}
以下 post
现在,一旦我点击登录,我就获得了令牌,使用 JwtAuthenticationInterceptor 的 setJwtToken() 方法设置它 class & 当我尝试使用下一个端点时,我收到 401 错误,因为 jwtToken 是即使我已经设置了它,它也会变成 null。
下面附上我的拦截器、组件和模块代码快照。
模块
@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);
}
}
问题出在这一行
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();
}