首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android改造与JWT认证

Android改造与JWT认证
EN

Stack Overflow用户
提问于 2020-04-22 14:49:55
回答 1查看 3K关注 0票数 1

我使用JWT身份验证,并将auth令牌存储在共享首选项中。我无法找到将授权头添加到改装客户端的方法。这就是为什么我第一次接到401个错误的网络呼叫,从第二次工作开始。如何解决这个问题?

代码语言:javascript
运行
复制
@Module
public class AppRetrofitModule {


private static final String TAG = "AppRetrofitModule";

private static Retrofit.Builder builder
        = new Retrofit.Builder()
        .baseUrl(Config.REST_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create());

private static Retrofit retrofit = builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();

private static OkHttpClient.Builder httpClient
        = new OkHttpClient.Builder();


private static HttpLoggingInterceptor logging
        = new HttpLoggingInterceptor()
        .setLevel(HttpLoggingInterceptor.Level.BASIC);


@Singleton
@Provides
public Retrofit provideRetrofit(AppPreferencesHelper appPreferencesHelper) {


    String authToken = "Bearer " + appPreferencesHelper.getAccessToken();
    Log.d(TAG, "provideRetrofit: " + authToken);


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

            Response response = chain.proceed(original);


            Request request = original.newBuilder()
                    .header("Authorization", authToken)
                    .method(original.method(), original.body()).build();
            return chain.proceed(request);
        }
    });

   if (!httpClient.interceptors().contains(logging)) {
       httpClient.addInterceptor(logging);
        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        httpClient.callTimeout(60, TimeUnit.SECONDS);

        builder.client(httpClient.build());
        retrofit = builder.build();
    }

    return retrofit;
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 20:47:17

代码语言:javascript
运行
复制
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            Response response = chain.proceed(original);
     String authToken = "Bearer " + appPreferencesHelper.getAccessToken();
 

            Request request = original.newBuilder()
                    .header("Authorization", authToken)
                    .method(original.method(), original.body()).build();
            return chain.proceed(request);
        }
    });

   if (!httpClient.interceptors().contains(logging)) {
       httpClient.addInterceptor(logging);
        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        httpClient.callTimeout(60, TimeUnit.SECONDS);

        builder.client(httpClient.build());
        retrofit = builder.build();
    }

    return retrofit;

在此之前,我犯了一个错误,就是把authToken放在拦截器之外。但是它需要在拦截器中获取,这样我们也可以在第一次获得令牌。因为authToken值会被刷新,所以它在第二个API调用之前就已经开始工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61368089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档