📅  最后修改于: 2023-12-03 15:11:32.501000             🧑  作者: Mango
JSON Web Token (JWT) 是一种用于身份验证的标准方法。在Web开发中,使用JWT能够实现RESTful API的身份验证和授权,无需使用Session和Cookies等会话管理方式。
本文将介绍如何在Django中使用简单的JWT进行身份验证。
在进行以下步骤之前,请确保您已安装了Python和Django,并创建了一个Django项目。然后在该项目下,使用pip进行安装:
pip install djangorestframework_simplejwt
在Django项目的settings.py文件中添加以下内容:
INSTALLED_APPS = [
# ...其他应用程序...
'rest_framework',
'rest_framework_simplejwt',
# ...其他应用程序...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
# ...其他身份验证类...
],
}
# JWT配置
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # token有效时间为5分钟
'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 刷新token有效时间为1天
'ROTATE_REFRESH_TOKENS': True, # 允许刷新token
'BLACKLIST_AFTER_ROTATION': False, # 黑名单不会被清空,而是保持连接,直到过期时间到期。
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256', # 使用HS256算法进行签名验证
'SIGNING_KEY': SECRET_KEY, # 私钥(配置文件中secret_key)
'VERIFYING_KEY': None, # 公钥(不设置,默认与私钥相同)
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
使用DRF提供的视图函数ObtainJSONWebTokenView,即可生成token。
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.permissions import AllowAny
class ObtainTokenPairWithIdView(TokenObtainPairView):
permission_classes = (AllowAny,)
serializer_class = ObtainTokenPairWithIdSerializer
其中,AllowAny实现了所有用户都可以访问该视图,并且无需被身份验证。serializer_class为生成token的序列化器。
在项目的urls.py中配置生成token的路由:
from django.urls import path
from .views import ObtainTokenPairWithIdView
urlpatterns = [
path('auth/', ObtainTokenPairWithIdView.as_view(), name='token_obtain_pair'),
]
实现序列化器:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class ObtainTokenPairWithIdSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# 添加自定义字段
token['name'] = user.name
return token
在需要使用token进行身份验证的视图函数中,即可使用@jwt_authenitcate
装饰器进行身份验证。如果身份验证未通过,将会抛出jwt.exceptions.InvalidTokenError
异常。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.decorators import jwt_authenticate
@jwt_authenticate
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def check_token(request):
return Response({'Detail': 'Token Valid'})
在使用JWT进行身份验证时,可以在Django项目中轻松地集成它。您只需在settings.py中添加所需的内容,即可生成和验证JWT,从而实现更加安全和可靠的Web应用程序。