天天看點

Retrofit-Android上的token驗證

這篇文章是一個除了前面的文章使用retrofit進行基本的身份驗證和使用基于OAuth的基本APIS。我們将讨論的話題token認證從一個Android應用到任何網絡服務或API支援這種認證。

Integrate Token Authentication

如果你讀前面的文章關于使用retrofit的身份驗證,你會猜到我們要怎麼做:擴充ServiceGenerator類和內建方法處理token認證。讓我們直接與第二個擴充ServiceGenerator createService方法:

Retrofit 1.9

public class ServiceGenerator {

    public static final String API_BASE_URL = "https://your.api-base.url";

    private static RestAdapter.Builder builder = new RestAdapter.Builder()
                .setEndpoint(API_BASE_URL)
                .setClient(new OkClient(new OkHttpClient()));

    public static <S> S createService(Class<S> serviceClass) {
        return createService(serviceClass, null);
    }

    public static <S> S createService(Class<S> serviceClass, final String authToken) {  
      if (authToken != null) {
          builder.setRequestInterceptor(new RequestInterceptor() {
              @Override
              public void intercept(RequestFacade request) {
                  request.addHeader("Authorization", authToken);
              }
          });
      }

      RestAdapter adapter = builder.build();
      return adapter.create(serviceClass);
    }
}      

Retrofit 2

public class ServiceGenerator {

    public static final String API_BASE_URL = "https://your.api-base.url";

    private static OkHttpClient httpClient = new OkHttpClient();
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createService(Class<S> serviceClass) {
        return createService(serviceClass, null);
    }

    public static <S> S createService(Class<S> serviceClass, final String authToken) {
        if (authToken != null) {
            httpClient.interceptors().clear();
            httpClient.interceptors().add(new Interceptor() {
                @Override
                public Response intercept(Interceptor.Chain chain) throws IOException {
                    Request original = chain.request();

                    // Request customization: add request headers
                    Request.Builder requestBuilder = original.newBuilder()
                            .header("Authorization", authToken)
                            .method(original.method(), original.body());

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

        Retrofit retrofit = builder.client(httpClient).build();
        return retrofit.create(serviceClass);
    }
}      

正如你所看到的,我們通過身份驗證标記作為一個字元串變量方法,使用RequestInterceptor(Interceptor in Retrofit 2)設定HTTP标頭字段進行授權。如果你使用另一個HTTP報頭字段為您的身份驗證token,上面的代碼調整或建立一個新的方法處理所需的功能。

從現在開始,每一個HTTP用戶端建立該方法內建了令牌授權頭字段的值,并自動傳遞token值與任何請求API端點。

Example Usage

讓我們建立一個例子,看看一些代碼。下面的UserService接口聲明一個方法叫me()。這個示例方法傳回一個使用者對象從API建立響應。

Retrofit 1.9

public interface UserService {  
    @POST("/me")
    User me();
}      

Retrofit 2

public interface UserService {  
    @POST("/me")
    Call<User> me();
}      

要特殊照顧調用API等待在終點HTTP任何要求://your.api-base.url/me并要求身份驗證以擷取使用者資料的響應。現在,讓我們建立一個使用者服務對象,做實際的請求 .

Retrofit 1.9

UserService userService =  
    ServiceGenerator.create(UserService.class, "auth-token");
User user = userService.me();      

Retrofit 2

UserService userService =  
    ServiceGenerator.create(UserService.class, "auth-token");
Call<User> call = userService.me();  
User user = call.execute().body();      

這段代碼示範了如何使用了類。當然,你必須要經過實際驗證token值ServiceGenerator方法。

繼續閱讀