Django-Rest-Knox提供了一个视图,用于为您提供令牌进行身份验证,但是该视图需要身份验证:
该如何使用?
在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的工作原理非常相似,第一次打开它时,它会要求您输入电子邮件和密码(不要离开并从网站上获取令牌):
Knox的LoginView的整个目标是在API请求中生成并提供该令牌:https://github.com/James1345/django-rest-knox/blob/05f218f1922999d1be76753076cf8af78f134e02/knox/views.py#L30-L55
这也是每个移动应用程序和SPA的工作量,在这种情况下,他们会要求您提供用户/电子邮件和密码来获取令牌,然后保存令牌以供进一步请求。
答案 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,)