【Django DRF】使用rest_framework_simplejwt搭建jwt——全解

一、Django 中配置 JWT 身份认证(使用 rest_framework_simplejwt


(一)安装 rest_framework_simplejwt

pip install rest_framework_simplejwt

(二)在 Django 设置中启用 JWT 配置

1. 修改 settings.py
# settings.py

INSTALLED_APPS = [
    # 其他应用
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),  # 配置访问令牌的过期时间
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),    # 配置刷新令牌的过期时间
    'ROTATE_REFRESH_TOKENS': True,                 # 刷新时是否生成新的 refresh token
    'BLACKLIST_AFTER_ROTATION': True,              # 是否在刷新后废弃旧的 refresh token
    'ALGORITHM': 'HS256',                          # 使用的加密算法 (HS256 或 RS256)
    'SIGNING_KEY': 'your-secret-key',              # 设置签名密钥
    'VERIFYING_KEY': None,                         # 如果使用公钥算法,可以配置验证密钥
}

# 如果有自定义用户模型
AUTH_USER_MODEL = 'user.CustomUser'
2. 配置作用解析
  • DEFAULT_AUTHENTICATION_CLASSES

    • 作用:指定用于验证用户身份的类。在此示例中,配置为基于 JWT 的身份认证。
    • 效果:如果用户提供的 Token 无效或过期,DRF 将无法识别用户。
  • DEFAULT_PERMISSION_CLASSES

    • 作用:设置用户访问资源的权限要求。在此配置中,默认要求用户已通过身份验证。
    • 效果:即使用户通过了身份验证,如果没有满足权限要求(例如未登录用户尝试访问),也会被拒绝。
  • 两者的关系

    • DEFAULT_AUTHENTICATION_CLASSES 负责确定用户“是谁”。
    • DEFAULT_PERMISSION_CLASSES 负责判断用户是否有“权限”访问资源。

(三)添加 JWT 认证路由

1. 修改 urls.py
from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    # 其他路径
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

(四)使用 JWT 进行认证

1. 获取 accessrefresh token
  • 发送 POST 请求到 /api/token/,携带 usernamepassword

请求示例:

POST /api/token/
Content-Type: application/json

{
  "username": "your_username",
  "password": "your_password"
}

返回示例:

{
  "access": "your_access_token",
  "refresh": "your_refresh_token"
}
2. 刷新 access token
  • 发送 POST 请求到 /api/token/refresh/,携带 refresh token:

请求示例:

POST /api/token/refresh/
Content-Type: application/json

{
  "refresh": "your_refresh_token"
}

返回示例:

{
  "access": "new_access_token"
}

(五)通过 JWT 访问受保护的 API

  • 在请求头中添加 Authorization: Bearer ,例如:
GET /protected/api/endpoint/
Authorization: Bearer your_access_token

(六)动态生成和使用 Token 与 Refresh

在某些情况下,您可能需要动态生成 Token 和 Refresh,或者在后端提供一个用户登录接口直接返回这些信息。以下是一个示例:

1. 生成 Token 的函数
from rest_framework_simplejwt.tokens import RefreshToken

def generate_tokens_for_user(user):
    """
    为指定用户生成 Access Token 和 Refresh Token。
    """
    refresh = RefreshToken.for_user(user)
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token)
    }
2. 使用示例
from django.contrib.auth import authenticate, login
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status

class LoginView(APIView):
    """
    用户登录视图,返回 Access 和 Refresh Token。
    """
    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')

        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            tokens = generate_tokens_for_user(user)
            return Response(tokens, status=status.HTTP_200_OK)
        else:
            return Response({"detail": "Invalid credentials."}, status=status.HTTP_400_BAD_REQUEST)
3. 示例请求和响应
  • 请求:
POST /api/login/
Content-Type: application/json

{
  "username": "test_user",
  "password": "test_password"
}
  • 响应:
{
  "refresh": "your_refresh_token",
  "access": "your_access_token"
}

通过这种方式,您可以在登录时动态生成和返回 Token,以供客户端使用。

你可能感兴趣的:(Django,DRF,django,python,后端,simplejwt,jwt)