Django?REST?Framework?(DRF)?項(xiàng)目中實(shí)現(xiàn)JWT的示例代碼
前言:JSON Web Tokens (JWT) 是一種開(kāi)放標(biāo)準(zhǔn) (RFC 7519),用于在各方之間安全地傳輸信息。在現(xiàn)代 Web 應(yīng)用中,JWT 認(rèn)證是一種常見(jiàn)的身份驗(yàn)證機(jī)制,它提供了無(wú)狀態(tài)、輕量級(jí)的身份驗(yàn)證方式。本文將詳細(xì)介紹如何在 Django REST Framework (DRF) 項(xiàng)目中實(shí)現(xiàn) JWT 認(rèn)證,并配置 token 黑名單以增強(qiáng)安全性。
1、安裝依賴(lài)
需要安裝 djangorestframework 和 djangorestframework-simplejwt 包。你可以使用 pip 來(lái)安裝它們
pip install djangorestframework pip install djangorestframework-simplejwt
2、配置項(xiàng)目
編輯 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 配置默認(rèn)認(rèn)證類(lèi)和權(quán)限類(lèi)
在 settings.py 中配置默認(rèn)的認(rèn)證類(lèi)和權(quán)限類(lèi):
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}3.2 配置JWT設(shè)置
在 settings.py 中配置 JWT 的一些選項(xiàng),例如 token 的過(guò)期時(shí)間、簽名算法等:
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)建一個(gè)視圖來(lái)處理登錄請(qǐ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 路由,以便訪問(wèn)登錄、注冊(cè)、刷新和注銷(xiāo)視圖:
# 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、測(cè)試API
使用 Postman 或其他 HTTP 客戶(hù)端來(lái)測(cè)試你的 API。以下是一些示例請(qǐng)求:
5.1 注冊(cè)新用戶(hù)
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 注銷(xiāo)(將token加入黑名單)
URL: /logout/
Method: POST
Body:
{
"refresh": "your_refresh_token"
}6、總結(jié)
通過(guò)以上步驟,我們成功地在 Django REST Framework 項(xiàng)目中實(shí)現(xiàn)了 JWT 認(rèn)證,并配置了 token 黑名單以增強(qiáng)安全性。JWT 認(rèn)證提供了一種無(wú)狀態(tài)、輕量級(jí)的身份驗(yàn)證方式,而 token 黑名單則確保了已注銷(xiāo)的 token 不會(huì)被再次使用,從而提高了應(yīng)用的安全性。
到此這篇關(guān)于Django REST Framework (DRF) 項(xiàng)目中實(shí)現(xiàn)JWT的示例代碼的文章就介紹到這了,更多相關(guān)Django REST Framework JWT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用python實(shí)現(xiàn)平穩(wěn)時(shí)間序列的建模方式
這篇文章主要介紹了利用python實(shí)現(xiàn)平穩(wěn)時(shí)間序列的建模方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python中實(shí)現(xiàn)輸入一個(gè)整數(shù)的案例
這篇文章主要介紹了Python中實(shí)現(xiàn)輸入一個(gè)整數(shù)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Django開(kāi)發(fā)的簡(jiǎn)易留言板案例詳解
這篇文章主要介紹了Django開(kāi)發(fā)的簡(jiǎn)易留言板,結(jié)合實(shí)例形式詳細(xì)分析了基于Python框架Django開(kāi)發(fā)留言板的具體文件結(jié)構(gòu)、流程步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
PyTorch?可視化工具TensorBoard和Visdom
這篇文章主要介紹了PyTorch?可視化工具TensorBoard和Visdom,TensorBoard?一般都是作為?TensorFlow?的可視化工具,與?TensorFlow?深度集成,它能夠展現(xiàn)?TensorFlow?的網(wǎng)絡(luò)計(jì)算圖,繪制圖像生成的定量指標(biāo)圖以及附加數(shù)據(jù)等,下面來(lái)看文章得具體內(nèi)容介紹吧2022-01-01
PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例
這篇文章主要介紹了PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例,本文直接給出代碼示例,需要的朋友可以參考下2014-11-11
python 使用get_argument獲取url query參數(shù)
這篇文章主要介紹了python 使用get_argument獲取url query參數(shù)的相關(guān)資料,需要的朋友可以參考下2017-04-04

