在使用Django REST framework想用JWT的人会发现django-rest-framework-jwt已经停止了更新版本,其对新版本的Django REST framework并不支持,所以小编在这推荐django-rest-framework-simplejwt。它继承了django-rest-framework-jwt的思想,应用比较相识。
setting.py配置
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
...
}
urls.py配置
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
...
# 认证令牌
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
# 刷新令牌
path('api/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
...
]
如果您希望允许API用户无需访问您的签名密钥即可验证HMAC签名的令牌,还可以包括一个简单JWT的路由
urlpatterns = [
...
path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
...
]
到这基本环境就已经完成了,你浏览器http://127.0.0.1:8000/api/token/的结果应该是这样
然后输入用户名和密码点击POST后,会返回加密后的刷新令牌和认证令牌,结果如下
你需要在serializers.py中加下面的代码(在官方文档中写的方法执行后没任何改变)
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
refresh = self.get_token(self.user)
data['refresh'] = str(refresh)
data['access'] = str(refresh.access_token)
data['username'] = self.user.username
return data
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
urls.py
# 记得引用一下MyTokenObtainPairView
urlpatterns = [
...
path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
...
]
可能有时候你需要的不仅仅是通过用户名登录,还可以通过手机邮箱等其他用户信息
views.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
# 记得引入用户的model
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
# noinspection PyBroadException
try:
# 小编这里添加了一个手机验证,如果需要其他验证再加就ok了
user = UserProfile.objects.get(Q(username=username) | Q(mobile=username))
if user.check_password(password):
return user
except Exception as e:
return None
上面的修改完后你还需要将修改后的类配置到setting.py中
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)