1

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

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

这打算如何使用?

按照有关设置的文档,我的设置如下所示:

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 的工作方式非常相似,当您第一次打开它时,它会要求您输入电子邮件和密码(不要离开并从网站获取令牌):

在此处输入图像描述

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

这也是几乎每个移动应用程序和 SPA 的工作方式,它们要求您提供用户/电子邮件和密码以获取令牌,然后保存令牌以供进一步请求。

4

3 回答 3

3

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

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

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

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

这是你的令牌:

326fe653946b99978900ae3820cb71f5eecf613ca71f8acde4e001a938bbba48

不知道作者为什么很难拿到token。你只需要解析字符串。

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

于 2019-05-25T11:28:17.873 回答
0

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

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

我没有把逗号放在后面permissions.AllowAny,更正了代码->

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)
于 2021-01-27T05:09:27.293 回答
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));
于 2019-06-25T18:56:11.870 回答