【问题标题】:OkHttp authenticatorOkHttp 身份验证器
【发布时间】:2017-04-13 18:59:03
【问题描述】:

我正在使用OkHttp3Retrofit2。 需要为所有请求替换令牌。 我写了一个TokenAuthentificator 类:

   public class TokenAuthenticator implements Authenticator {

        @Override
        public Request authenticate(Route route, okhttp3.Response response) throws IOException {
            return response.request().newBuilder()
                    .header(Const.Url.COOKIE, preferenceHelper.getToken())
                    .build();
        }
    }

并使用 Retrofit 对其进行初始化:

@Inject
public RestApi(PreferenceHelper preferenceHelper) {
    TokenAuthenticator authenticator = new TokenAuthenticator();

    this.preferenceHelper = preferenceHelper;
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .authenticator(authenticator)
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();


    Retrofit retrofit = new Retrofit.Builder().baseUrl(Const.Url.API)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    user = retrofit.create(User.class);
}

但是,请求中的标头仍然没有被替换。 可能是什么问题?

请求示例:

 @Multipart
    @POST("user_set_photo")
    Observable<Response<TechmasResponse>> setPhoto(@Part("PERSONAL_PHOTO\"; filename=\"image.png\" ") RequestBody file);

在活动/片段中,如下所示:

Subscription request = restApi.user.setPhoto(body)
                .compose(RxUtils.applySchedulers())
                .subscribe(this::successAddPhoto, this::handleError);
        unSubscribeOnDestroy(request);

【问题讨论】:

    标签: android retrofit2 okhttp3


    【解决方案1】:

    Authenticator 在您请求返回 401 并且您需要更新您的令牌时使用,否则使用Interceptor 以更新您的请求(听众,添加令牌)。

    请勿使用Interceptor 更新您的令牌

    所以你的TokenAuthenticator 必须实现Interceptor

    【讨论】:

      【解决方案2】:

      在 SharedPreerences 中存储令牌并从 Interceptor 加载它:

      public class TokenAppendingHeaderInterceptor implements Interceptor {
      
          private TokenStorage tokenStorage;
      
          public TokenAppendingHeaderInterceptor(TokenStorage tokenStorage){
              this.tokenStorage = tokenStorage;
          }
      
          @Override
          public Response intercept(Chain chain) throws IOException {
              Request request = chain.request();
              String token = tokenStorage.getToken();
              Request newRequest = request.newBuilder()
                      .addHeader("Accept", "application/json")
                      .addHeader("sessionId", token)
                      .addHeader("application-type", "REST")
                      .build();
              return chain.proceed(newRequest);
          }
      }
      

      它对我有用

      【讨论】:

        猜你喜欢
        • 2015-09-09
        • 2015-11-19
        • 2015-06-09
        • 2020-07-18
        • 2019-09-13
        • 2014-04-24
        • 2023-03-05
        • 2020-07-10
        • 1970-01-01
        相关资源
        最近更新 更多