如何从Android客户端进行经过身份验证的django rest api调用?

时间:2017-07-25 11:50:45

标签: java android django-rest-framework restful-authentication

我正在创建一个Android应用程序,它有一个django rest api作为后端,并希望使用在用户登录时提供给用户的令牌进行经过身份验证的网络调用。

我正在使用改造来向后端发出请求。以下是我现在正在尝试对其余api进行身份验证的网络调用。

@Override
public void loadAllUsers() {
    Call<List<User>> call = userServiceApi.loadAllUsers();
    call.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(@NonNull Call<List<User>> call, @NonNull Response<List<User>> response) {
            if (response.isSuccessful()) {
                List<User> users = response.body();
                eventBus.post(new LoadAllUsersEvent(users));
            } else {
                eventBus.post(new FailLoadAllUsersEvent());
                Log.d(TAG, response.message());
            }
        }

        @Override
        public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
            eventBus.post(new LoadUsersUnreachableServerEvent());
            Log.d(TAG, t.toString());
        }
    });
}

以下是与此api请求相关的改造界面:

@GET("users/")
Call<List<User>> loadAllUsers(@Header("Authorization: Token ") Token token);

当我进行此调用时,将用户的令牌作为标题传递,我得到状态码401:未经身份验证:&#34; GET / users / HTTP / 1.1&#34; 401 58

django rest Token Authentication工作和进行经过身份验证的django rest api电话我做错了什么?

1 个答案:

答案 0 :(得分:2)

快速解决此问题的方法是更改​​api界面:

@GET("users/")
Call<List<User>> loadAllUsers(@Header("Authorization") Token token);

您传入的值应格式化为"Token %s"

这不是一个很好的解决方案,因为你必须将令牌传递给你的所有api电话。

解决授权问题的更好方法是使用OkHttp client并实施身份验证器,它会为您处理所有事情。

OkHttp和Retrofit很好地协同工作。