📜  简单的 jwt django - Python (1)

📅  最后修改于: 2023-12-03 15:11:32.501000             🧑  作者: Mango

简单的 JWT Django - Python

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',
}
生成Token

使用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

在需要使用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应用程序。