📜  使用 Django REST 框架进行 JWT 身份验证(1)

📅  最后修改于: 2023-12-03 15:06:46.104000             🧑  作者: Mango

使用 Django REST 框架进行 JWT 身份验证

Django REST 框架是一个建立在 Django 框架之上的库,用于构建 Web API。该库提供了一些工具和建议,以帮助开发人员更容易地构建强大的 Web API。

JWT 是一种开放标准 (RFC 7519),用于在两个实体之间传输信息。在 Web 开发中,JWT 常被用于用户身份认证以及 API 访问授权。

在本文中,我们将介绍如何使用 Django REST 框架进行 JWT 身份验证。

安装

首先,我们需要安装 Django REST 框架和 PyJWT 库。可以使用 pip 进行安装:

pip install djangorestframework
pip install pyjwt
配置

为了使用 JWT 身份验证,我们需要进行一些配置。在 Django 的 settings.py 文件中,添加以下代码:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

JWT_AUTH = {
    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_ALGORITHM': 'HS256',
    'JWT_ALLOW_REFRESH': True,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30),
}

这样,我们就启用了 JWT 身份验证,并配置了加密密钥 (SECRET_KEY)、算法 (HS256)、过期时间以及刷新时间。

实现

使用 Django REST 框架实现 JWT 身份验证的关键在于 API 访问授权的实现。在 RESTful API 中,有两种授权方式:基于 cookie 的 SessionAuthentication 和基于 JWT 的 TokenAuthentication。

在 JWT 身份验证中,我们可以使用 TokenAuthentication 来实现。我们需要在 API 视图类中添加以下代码:

from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from django.contrib.auth import authenticate

@api_view(['POST'])
@authentication_classes([JSONWebTokenAuthentication])
@permission_classes([IsAuthenticated])
def example_view(request):
    return Response({'message': 'Authenticated'})

这个视图用于验证用户身份。在视图函数被调用时,Django REST 框架将在请求对象中查找 JWT,然后使用 PyJWT 库对其进行验证。如果 JWT 有效,则用户被认为已经通过身份验证,并且可以访问受保护的 API 资源。

为了生成 JWT,我们需要编写注册和登录视图。在注册视图中,我们需要创建用户对象,并使用 PyJWT 库生成 JWT。在登录视图中,我们需要使用 authenticate() 函数进行身份验证,并在成功验证后生成 JWT。

import jwt
from django.conf import settings
from django.contrib.auth.models import User
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework_jwt.settings import api_settings
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

@api_view(['POST'])
@csrf_exempt
def register_view(request):
    username = request.data['username']
    password = request.data['password']

    try:
        user = User.objects.create_user(
            username=username,
            password=password
        )
        token = api_settings.JWT_ENCODE_HANDLER(
            api_settings.JWT_PAYLOAD_HANDLER(user)
        )
        return JsonResponse({'token': token})
    except:
        return JsonResponse({'error': 'Unable to register user'})

@api_view(['POST'])
@csrf_exempt
def login_view(request):
    username = request.data['username']
    password = request.data['password']

    user = authenticate(username=username, password=password)

    if user is not None:
        token = api_settings.JWT_ENCODE_HANDLER(
            api_settings.JWT_PAYLOAD_HANDLER(user)
        )
        return JsonResponse({'token': token})
    else:
        return JsonResponse({'error': 'Invalid credentials'})
测试

为了测试 JWT 身份验证的实现,我们可以使用 Postman 工具来发送 API 请求。

首先,我们需要注册用户。发送 POST 请求到 /register URL,请求体中包含用户名和密码。如果注册成功,则服务器将返回包含 JWT 的 JSON 响应。拷贝 JWT 并保存,在后续的请求中使用。

接下来,我们可以使用保存的 JWT 发送任何受保护的请求。例如,我们可以发送 GET 请求到 /example URL,该请求需要身份验证才能访问。在请求头中添加 Authorization 字段,值为 Bearer JWT,其中 JWT 是之前保存的 JSON Web Token。

如果 JWT 有效,则服务器将返回一个包含消息 “Authenticated”的 JSON 响应。

结论

在本文中,我们介绍了如何使用 Django REST 框架进行 JWT 身份验证。我们详细讲解了安装、配置和实现步骤,并提供了一个示例视图、注册和登录方法以及测试方法。

使用 JWT 身份验证,我们可以更好地保护我们的 Web API,并保障用户身份的安全性,值得我们去尝试。