【问题标题】:How to make authenticated django rest api call from android client?如何从 android 客户端进行经过身份验证的 django rest api 调用?
【发布时间】:2017-12-31 07:52:40
【问题描述】:

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

我正在使用改造向后端发出请求。这是我现在正在做的尝试对其余 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:未验证:“GET /users/ HTTP/1.1”401 58

我做错了什么让 django rest Token Authentication 工作并进行经过身份验证的 django rest api 调用?

【问题讨论】:

  • 你也在使用 OkHttp 吗?
  • 不,我没有使用 OkHttp。

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


【解决方案1】:

对此的快速解决方法是更改​​您的 api 接口:

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

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

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

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

OkHttp 和 Retrofit 配合得非常好。

【讨论】:

  • 这是一个很好的futurestud.io/tutorials/…,但它是用于改造1的。唯一的区别是RestAdapter被重命名为Retrofit。当然我建议使用最新版本的 OkHttp 和 Retrofit。
  • 所以身份验证标头是否应该包含“令牌 %s”而不是“授权”,因为我已经使用 OkHttp 实现了它,它说“标头名称中的 5 中的意外字符 0x20:令牌 %s”@Andrej尤金
  • 嘿汤姆,标题是键值对。关键是“授权”值是您传递到改造界面的值,字符串应该是“令牌 0b79bab50daca910b000d4f1a2b675d604257e42”。类似的东西。
  • 现在我得到另一个错误。 java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT。它运行 onFailure 方法而不是 onResponse
  • 这意味着您的请求在解析时通过并失败。您的身份验证问题已解决。请关闭问题并继续在别处寻找答案。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2021-06-05
  • 2016-04-16
  • 2013-01-20
  • 2012-08-17
相关资源
最近更新 更多