如何从 android 客户端进行经过身份验证的 django rest api 调用?
Posted
技术标签:
【中文标题】如何从 android 客户端进行经过身份验证的 django rest api 调用?【英文标题】:How to make authenticated django rest api call from android client? 【发布时间】: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。 【参考方案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 这意味着您的请求在解析时通过并失败。您的身份验证问题已解决。请关闭问题并继续在别处寻找答案。以上是关于如何从 android 客户端进行经过身份验证的 django rest api 调用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中对 Uber SDK 中的用户进行身份验证?
如何在 Node.js 中从请求参数获取经过身份验证的用户到 socket.io