如何从 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 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用球衣发送经过 NTLM 身份验证的发布请求?

如何在 Android 中对 Uber SDK 中的用户进行身份验证?

如何使用 Axios 使用经过身份验证的 API

如何在 Node.js 中从请求参数获取经过身份验证的用户到 socket.io

如何在 Cloud Functions 存储触发器中获取经过身份验证的 Firebase 用户的 uid

android to django - 如何对用户进行身份验证