使用django-rest-knox时如何登录?

时间:2019-05-06 08:42:56

标签: django django-rest-framework django-rest-knox

Django-Rest-Knox提供了一个视图,用于为您提供令牌进行身份验证,但是该视图需要身份验证:

https://github.com/James1345/django-rest-knox/blob/05f218f1922999d1be76753076cf8af78f134e02/knox/views.py#L16

该如何使用?

the documentation on setting it up之后,我的设置如下:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication',),
}

我尝试通过这种方式进行身份验证:

fetch("http://localhost:8000/api-v1/auth/login/", {
    method: "POST",
    body: JSON.stringify({email: email, password: password}),
    headers: {
        "Accept": "application/json",
        "Content-Type": "application/json",
    }
}).then(result => result.json())
    .then(result => {
        console.log(result);
    });

但是IsAuthenticated正在阻止我并显示以下消息:

Unauthorized: /api-v1/auth/login/

在Django方面,而在JavaScript方面:

{"detail":"Authentication credentials were not provided."}

电子邮件和密码与我在管理工具上成功登录所使用的密码相同。

为澄清起见,我没有人登录到Web应用程序并将令牌复制并粘贴到其他应用程序的系统。在我正在构建的系统中,您可以使用您的用户名和密码直接通过API登录,然后获取令牌并将其保存以用于后续请求。

与LastPass的工作原理非常相似,第一次打开它时,它会要求您输入电子邮件和密码(不要离开并从网站上获取令牌):

enter image description here

Knox的LoginView的整个目标是在API请求中生成并提供该令牌:https://github.com/James1345/django-rest-knox/blob/05f218f1922999d1be76753076cf8af78f134e02/knox/views.py#L30-L55

这也是每个移动应用程序和SPA的工作量,在这种情况下,他们会要求您提供用户/电子邮件和密码来获取令牌,然后保存令牌以供进一步请求。

4 个答案:

答案 0 :(得分:0)

遵循本指南。而且,您将不得不拆分序列化程序数据以获取令牌。

https://gist.github.com/AndrewPix/cdd9276b1d5683459b965d5cc4517b26

例如,登录后您的结果将是这样:

"(<AuthToken: 853d34ff808bf07c112b87bbc1bf59e3159fa6765f8bcd34b6376fbef08c9369e2b28a39ff868949e047de4a2164183cc1b16d61e87476129c18339dedee6ff0 : mdmd@gmail.com>, '326fe653946b99978900ae3820cb71f5eecf613ca71f8acde4e001a938bbba48')" 

这是您的令牌:

326fe653946b99978900ae3820cb71f5eecf613ca71f8acde4e001a938bbba48

不知道为什么作者很难获得令牌。您只需要解析字符串即可。

具有更好解决方案的任何人都应提交答案。

答案 1 :(得分:0)

您必须在登录视图中选择身份验证方法。因此,您第一次必须通过Django中可用的身份验证方法之一进行身份验证。

Basic Auth是一个很好的候选人。

from knox.views import LoginView as KnoxLoginView
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated


class LoginAPI(KnoxLoginView):
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated]

然后在前端:

const credentials = btoa(`${username}:${password}`);

fetch("http://localhost:8000/api-v1/auth/login/", {
   method: "POST",
   body: JSON.stringify({}),
   headers: {
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": `Basic ${credentials}`
    }
}).then(result => console.log(result));

答案 2 :(得分:0)

您需要提供Token,然后只有您才能登录

答案 3 :(得分:0)

我在 url api/login, 遇到了问题,在我的情况下,问题出在 views.py

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny)

我没有在 permissions.AllowAny 后面加逗号, 更正的代码->

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)