android - 将 JWT 身份验证 token 添加到 OkHttp、Dagger 2 和 Retrofit

标签 android dagger-2 okhttp

关注帖子 Dagger + Retrofit. Adding auth headers at runtime我正在尝试配置 okHttp 并通过添加拦截器将 jwt auth key 添加到 okHttp,为此我创建了单独的拦截器并将其添加到 Dagger 的组件中,以便它可以在任何地方公开。

现在,一旦我点击登录,我就获得了 token ,使用 JwtAuthenticationInterceptor 类的 setJwtToken() 方法设置它,当我尝试使用下一个端点时,我收到 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);
    }
}

最佳答案

问题是这一行

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();
}

关于android - 将 JWT 身份验证 token 添加到 OkHttp、Dagger 2 和 Retrofit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281653/

相关文章:

android - Dagger:组件中存在具有匹配键的绑定(bind)

java - Dagger 2 不生成子组件实现

android - Retrofit(2.0 beta2) 分段文件上传不起作用

android - 如何解决 "Do not override the Object.finalize() method"问题

android - 如何在 Android Canvas 中使用 "inverted"绘图进行绘制?

java - 显示来自 SQLite 数据库 android studio 的用户名

android - 类似 oldschool 2D zelda 游戏的最佳方法

android - Dagger 2 androidx fragment 不兼容类型

Android - OkHttp 拦截器调用 onFailure

android - Okhttp Authenticator 多线程