Django?REST?Framework?(DRF)?項目中實現(xiàn)JWT的示例代碼
前言:JSON Web Tokens (JWT) 是一種開放標準 (RFC 7519),用于在各方之間安全地傳輸信息。在現(xiàn)代 Web 應(yīng)用中,JWT 認證是一種常見的身份驗證機制,它提供了無狀態(tài)、輕量級的身份驗證方式。本文將詳細介紹如何在 Django REST Framework (DRF) 項目中實現(xiàn) JWT 認證,并配置 token 黑名單以增強安全性。
1、安裝依賴
需要安裝 djangorestframework 和 djangorestframework-simplejwt 包。你可以使用 pip 來安裝它們
pip install djangorestframework pip install djangorestframework-simplejwt
2、配置項目
編輯 settings.py 文件,添加 rest_framework 和 rest_framework_simplejwt 到 INSTALLED_APPS:
INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist', ... ]
3、配置JWT
3.1 配置默認認證類和權(quán)限類
在 settings.py
中配置默認的認證類和權(quán)限類:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), }
3.2 配置JWT設(shè)置
在 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', }
4、創(chuàng)建視圖和序列化器
4.1 創(chuàng)建自定義 Token 視圖
創(chuàng)建一個視圖來處理登錄請求,返回 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')
4.2 配置URL
在 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'), ]
5、測試API
使用 Postman 或其他 HTTP 客戶端來測試你的 API。以下是一些示例請求:
5.1 注冊新用戶
URL: /register/
Method: POST
Body:
{ "username": "testuser", "email": "testuser@example.com", "password": "testpassword" }
5.2 登錄并獲取JWT token
URL: /login/
Method: POST
Body:
{ "username": "testuser", "password": "testpassword" }
5.3 刷新JWT token
URL: /login/refresh/
Method: POST
Body:
{ "refresh": "your_refresh_token" }
5.4 注銷(將token加入黑名單)
URL: /logout/
Method: POST
Body:
{ "refresh": "your_refresh_token" }
6、總結(jié)
通過以上步驟,我們成功地在 Django REST Framework 項目中實現(xiàn)了 JWT 認證,并配置了 token 黑名單以增強安全性。JWT 認證提供了一種無狀態(tài)、輕量級的身份驗證方式,而 token 黑名單則確保了已注銷的 token 不會被再次使用,從而提高了應(yīng)用的安全性。
到此這篇關(guān)于Django REST Framework (DRF) 項目中實現(xiàn)JWT的示例代碼的文章就介紹到這了,更多相關(guān)Django REST Framework JWT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python face_recognition實現(xiàn)AI識別圖片中的人物
最近碰到了照片識別的場景,正好使用了face_recognition項目,給大家分享分享。face_recognition項目能做的很多,人臉檢測功能也是有的,是一個比較成熟的項目。感興趣的可以了解一下2022-01-01Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例
這篇文章主要為大家介紹了Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Python操作Redis數(shù)據(jù)庫的詳細教程與應(yīng)用實戰(zhàn)
Redis是一個高性能的鍵值存儲數(shù)據(jù)庫,支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串、哈希表、列表、集合和有序集合等,在Python中,通過redis-py庫可以方便地操作Redis數(shù)據(jù)庫,本文將詳細介紹如何在Python代碼中操作Redis,需要的朋友可以參考下2024-08-08pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)
這篇文章主要介紹了pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理),pandas對大數(shù)據(jù)有很多便捷的清洗用法,尤其針對缺失值和重復(fù)值,詳細介紹感興趣的小伙伴可以參考下面文章內(nèi)容2022-08-08