我知道这个问题已经有一年了,但是我刚刚想到如何让 Djoser 和 django-rest-knox 协同工作,并且确实同样的技巧也适用于 djangorestframework-jwt。 诀窍是知道您可以在不使用其认证相关端点的情况下使用Djoser的帐户端点,您只需要将每个库放在其自己的端点上。
这里是我如何设置Django Rest Framework使用JWT登录并对Djoser端点进行身份验证的方式(我将从头开始):
首先,安装 djangorestframework-jwt和djoser:
pip install djangorestframework-jwt djoser
在Django项目的
settings.py
中将
JSONWebTokenAuthentication
添加到
DEFAULT_AUTHENTICATION_CLASSES
以指定您想要使用JWT进行身份验证:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
接下来,将djoser.urls
和rest_framework_jwt
的obtain_jwt_token
视图添加到您的URL中:
from django.conf.urls import url, include
from rest_framework_jwt import views as jwt_views
urlpatterns = [
url(r'^account/', include('djoser.urls')),
url(r'^auth/login/', jwt_views.obtain_jwt_token, name='auth'),
]
这应该是你开始的所有内容。为了安全起见,请运行 migrate
(我为这篇文章创建了一个全新的Django Rest Framework实例,并且在此之前尚未运行初始提交):
python manage.py migrate
如果您还没有创建用户,请创建一个新用户以测试功能:
python manage.py createsuperuser
一旦您拥有用户账户,运行runserver
,然后尝试登录以获取您的JWT:
http POST http://localhost:800/auth/login/ username=admin password=password
您应该会得到一个令牌:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"
}
接下来,您可以使用此令牌对Djoser的/me/端点进行身份验证,以获取您的个人资料信息。只需将您的令牌包含在请求头中,如Authorization: JWT:
http http://localhost:8000/account/me/ "Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"
这是我得到的结果:
{
"email": "",
"id": 2,
"username": "admin"
}
正如您所看到的,使用JWT进行身份验证非常容易。 我猜测像djoser和django-rest-auth这样的库专注于基本、会话或令牌身份验证,是因为它们已经包含在DRF框架中,因此可能是人们在服务器上进行调用身份验证最常见的方法。
所有这些美妙之处在于,实现更安全的身份验证方案很容易,因为Djoser并没有紧密耦合自己的身份验证类 - 它将乐意尊重您设置的DEFAULT_AUTHENTICATION_CLASSES
。