美文网首页Android无止境Android Http程序员
Retrofit系列文章翻译3—Android上的令牌认证

Retrofit系列文章翻译3—Android上的令牌认证

作者: 张金富呵呵 | 来源:发表于2016-08-13 09:28 被阅读845次

    原文链接:https://futurestud.io/blog/retrofit-token-authentication-on-android
    本文是Retrofit系列文章的第三篇。本节介绍了 Retrofit 如何集成基于令牌验证的API到你的Android项目。下面的列表显示了该系列的所有文章:

    Retrofit 系列目录

    1. 开始创建android客户端[已翻译]
    2. Android上的基本认证[已翻译]
    3. Android上的令牌认证
    4. Android上的OAuth
    5. 多个 Query 参数使用同一名字[已翻译]
    6. 同步与异步请求[已翻译]
    7. 在请求体里发送对象[已翻译]
    8. 自定义一个响应转换器[已翻译]
    9. 添加自定义请求头
    10. 可选的 Query 参数
    11. 如何集成 XML 转换器
    12. 使用 Log Level 调试请求
    13. 如何上传文件
    14. Series Round-Up
    15. Retrofit 2 — 1.9 升级指南
    16. Retrofit 2 — 如何上传文件
    17. Retrofit 2 — Log 请求与响应
    18. Retrofit 2 — Android 上的 Hawk 认证
    19. Retrofit 2 — 简单错误处理
    20. 如何在 Retrofit 1 里使用 OkHttp 3
    21. Retrofit 2 — 图书更新发布庆典
    22. 提交表单数据 — Urlencoded
    23. 提交表单数据 — Urlencoded 使用FieldMap
    24. Retrofit 2 — 在 OkHttp 拦截器里管理请求头部
    25. Retrofit 2 — 如何给每一个请求添加 Query 参数
    26. Retrofit 2 — 使用QueryMap 添加多个 Query 参数
    27. Retrofit 2 — 如何在请求时使用动态 Url
    28. Retrofit 2 — Url 处理,分辨和解析
    29. Retrofit 2 — POST 和PUT 请求里的常量, 默认值和逻辑值
    30. Retrofit 2 — 如何下载文件
    31. Retrofit 2 — 取消请求
    32. Retrofit 2 — 重用分析请求
    33. Retrofit 2 — 如何在运行时修改 API Base Url
    34. 可选Path参数
    35. 如何刷新 Access Token
    36. Retrofit 2 — 如何提交文本请求体
    37. Retrofit 2 — 使用 Query 参数来分页
    38. Retrofit 2 — 使用 链接头和动态 Url 来分页(比如GitHub)
    39. Retrofit 2 — 使用范围头字段来分页 (比如 Heroku)
    40. Retrofit 2 — 转换器介绍
    41. Retrofit 2 — 添加并自定义 Gson 转换器
    42. Retrofit 2 — 实现自定义转换器
    43. Retrofit 2 — 只在开发环境里启用日志
    44. Retrofit 2 — 如何上传多个文件
    45. Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
    46. Retrofit 2 — 模仿服务端响应基本概念
    47. Retrofit 2 — 模仿服务端响应自定义网络行为
    48. Retrofit 2 — 使用 @HeaderMap 定义动态请求头

    本篇在上一篇 Android上的基本认证 的基础上使用了 Retrofit 的 OAuth APIs(不是下一篇才会讲吗? 译者注). 我们将涵盖本话题.

    集成令牌认证

    如果你阅读了上一篇关于Retrofit 认证的文章, 那么你应该猜出我们将做什么: 扩展 ServiceGenerator 类 — 集成一个处理令牌认证的方法. 那就让我们开始扩展 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.Builder httpClient = new OkHttpClient.Builder();
    
        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.addInterceptor(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);
                    }
                });
            }
    
            OkHttpClient client = httpClient.build();
            Retrofit retrofit = builder.client(client).build();
            return retrofit.create(serviceClass);
        }
    }
    

    正如你见到的, 我们将认证令牌做为String变量传进方法, 使用RequestInterceptor( Retrofit 2 中是Interceptor) 来设置 HTTP Authorization 头部域. 如果你是用的是另一个 HTTP 头部域来存储认证令牌, 或者调整上述代码或者创建一个新方法来处理需要的功能.
    就是这样 :)
    从现在开始, 每一个用此方法创建的 HTTP 客户端都在Authorization头部域集成了令牌并且自动将令牌传送到你的请求的 API 端点.

    用法示例

    让我们创建一个示例并写一点代码. 下列的UserService接口声明了一个me()方法. 这个例子方法返回API响应创建的user对象.

    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等待所有请求并需要认证来获取响应的用户数据. 现在, 让我们创建一个UserService`接口来做实际的请求.

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

    这个代码只是说明如何使用现成的类. 当然, 你必须传送你的实际的认证令牌给ServiceGenerator 方法.
    祝您使用 Retrofit 的API 认证 编程愉快. 如果你遇到了任何问题, 请联系我们 @futurestud_io.

    本篇结束, 感觉比上一篇还简单啊 :) 译者注

    相关文章

      网友评论

      • b6c7a3ded5ff:有几个章节看了一下,他的博客好像也没有,书卖的好贵啊 :joy:
        张金富呵呵:@dyhuang 是啊 所以我先不翻译了 这些都是入门文章 已经差不多了

      本文标题:Retrofit系列文章翻译3—Android上的令牌认证

      本文链接:https://www.haomeiwen.com/subject/zrbesttx.html