
前言:JSON Web Tokens (JWT) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息。在现代 Web 应用中,JWT 认证是一种常见的身份验证机制,它提供了无状态、轻量级的身份验证方式。本文将详细介绍如何在 Django REST Framework (DRF) 项目中实现 JWT 认证,并配置 token 黑名单以增强安全性。
需要安装 djangorestframework 和 djangorestframework-simplejwt 包。你可以使用 pip 来安装它们
pip install djangorestframework pip install djangorestframework-simplejwt
编辑 settings.py 文件,添加 rest_framework 和 rest_framework_simplejwt 到 INSTALLED_APPS:
INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist', ... ]
在 settings.py
中配置默认的认证类和权限类:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), }
在 settings.py 中配置 JWT 的一些选项,例如 token 的过期时间、签名算法等:
from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': True, 'BLACKLIST_AFTER_ROTATION': True, 'ALGORITHM': 'HS256', 'SIGNING_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', }
创建一个视图来处理登录请求,返回 JWT token。
# views.py from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenBlacklistView from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from django.contrib.auth.models import User from .serializers import RegisterSerializer class MyTokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): token = super().get_token(user) # Add custom claims token['username'] = user.username return token class MyTokenObtainPairView(TokenObtainPairView): serializer_class = MyTokenObtainPairSerializer class RegisterView(APIView): def post(self, request, *args, **kwargs): serializer = RegisterSerializer(data=request.data) if serializer.is_valid(): user = serializer.save() return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "message": "User Created Successfully. Now perform Login to get your token", }) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # serializers.py from rest_framework import serializers from django.contrib.auth.models import User class RegisterSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('username', 'password', 'email') extra_kwargs = {'password': {'write_only': True}} def create(self, validated_data): user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) return user class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email')
在 urls.py 中配置 URL 路由,以便访问登录、注册、刷新和注销视图:
# urls.py from django.urls import path from .views import MyTokenObtainPairView, RegisterView urlpatterns = [ path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'), path('login/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('logout/', TokenBlacklistView.as_view(), name='token_blacklist'), path('register/', RegisterView.as_view(), name='auth_register'), ]
使用 Postman 或其他 HTTP 客户端来测试你的 API。以下是一些示例请求:
URL: /register/
Method: POST
Body:
{ "username": "testuser", "email": "testuser@example.com", "password": "testpassword" }
URL: /login/
Method: POST
Body:
{ "username": "testuser", "password": "testpassword" }
URL: /login/refresh/
Method: POST
Body:
{ "refresh": "your_refresh_token" }
URL: /logout/
Method: POST
Body:
{ "refresh": "your_refresh_token" }
通过以上步骤,我们成功地在 Django REST Framework 项目中实现了 JWT 认证,并配置了 token 黑名单以增强安全性。JWT 认证提供了一种无状态、轻量级的身份验证方式,而 token 黑名单则确保了已注销的 token 不会被再次使用,从而提高了应用的安全性。
到此这篇关于Django REST Framework (DRF) 项目中实现JWT的示例代码的文章就介绍到这了,更多相关Django REST Framework JWT内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!