欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django?REST?Framework?(DRF)?項目中實現(xiàn)JWT的示例代碼

 更新時間:2025年02月07日 10:22:43   作者:春天的菠菜  
本文主要介紹了Django?REST?Framework?(DRF)?項目中實現(xiàn)JWT的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言: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識別圖片中的人物

    Python face_recognition實現(xiàn)AI識別圖片中的人物

    最近碰到了照片識別的場景,正好使用了face_recognition項目,給大家分享分享。face_recognition項目能做的很多,人臉檢測功能也是有的,是一個比較成熟的項目。感興趣的可以了解一下
    2022-01-01
  • 基于Python編寫一個有趣的年會抽獎系統(tǒng)

    基于Python編寫一個有趣的年會抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了如何使用Python編寫一個簡易的抽獎系統(tǒng),順便幫助大家鞏固一下對Python語法和框架的理解,感興趣的小伙伴可以了解下
    2023-12-12
  • Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例

    Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例

    這篇文章主要為大家介紹了Python實現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • python中int與str互轉(zhuǎn)方法

    python中int與str互轉(zhuǎn)方法

    最近學(xué)習(xí)python中的數(shù)據(jù)類型時,難免聯(lián)想到j(luò)ava中的基本型數(shù)據(jù)類型與引用型數(shù)據(jù)類型。接下來通過本文給大家介紹python中int與str互轉(zhuǎn),需要的朋友可以參考下
    2018-07-07
  • python高級特性和高階函數(shù)及使用詳解

    python高級特性和高階函數(shù)及使用詳解

    Python很棒,它有很多高級用法值得細細思索,學(xué)習(xí)使用。這篇文章主要介紹了python高級特性和高階函數(shù)及使用詳解,需要的朋友可以參考下
    2018-10-10
  • python通過移動端訪問查看電腦界面

    python通過移動端訪問查看電腦界面

    這篇文章主要介紹了python通過移動端訪問查看電腦界面,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Python操作Redis數(shù)據(jù)庫的詳細教程與應(yīng)用實戰(zhàn)

    Python操作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-08
  • 關(guān)于pandas-profiling的降級之旅

    關(guān)于pandas-profiling的降級之旅

    這篇文章主要介紹了關(guān)于pandas-profiling的降級之旅,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Python的Flask框架中web表單的教程

    Python的Flask框架中web表單的教程

    這篇文章主要介紹了Python的Flask框架中web表單的教程,表單是學(xué)習(xí)各個web框架中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-04-04
  • pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)

    pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)

    這篇文章主要介紹了pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理),pandas對大數(shù)據(jù)有很多便捷的清洗用法,尤其針對缺失值和重復(fù)值,詳細介紹感興趣的小伙伴可以參考下面文章內(nèi)容
    2022-08-08

最新評論