在现代 web 开发中,认证机制是一个非常重要的部分。JSON Web Token(JWT)因其简洁的结构和易于使用的特性,成为了许多应用的首选认证方案。本文将介绍如何在 Django 应用中使用 JWT 进行用户认证,并结合具体代码示例进行讲解。

什么是 JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑、自包含的方式,用于在各方之间安全地传递信息。该信息可以被验证和信任,因为它是数字签名的。JWT 可以使用 HMAC 算法或使用 RSA 的公私钥对进行签名。

环境准备

首先,确保你已经安装了 Django 和 djangorestframework。可以使用以下命令进行安装:

pip install django djangorestframework djangorestframework-simplejwt

创建 Django 项目和应用

接下来,创建一个新的 Django 项目和一个名为 authapp 的应用:

django-admin startproject jwt_demo
cd jwt_demo
django-admin startapp authapp

然后,在 settings.py 文件中添加 authapprest_framework

INSTALLED_APPS = [
    ...
    'rest_framework',
    'authapp',
]

配置 REST Framework 和 JWT

我们需要在 settings.py 中配置 Django REST Framework 使用 JWT 进行认证:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

创建用户注册和登录视图

authapp/views.py 文件中,我们将创建用户注册和登录的视图:

from django.contrib.auth.models import User
from rest_framework import generics
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework import status
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth import authenticate

class UserRegisterView(generics.CreateAPIView):
    permission_classes = (AllowAny,)
    queryset = User.objects.all()

    def create(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        if User.objects.filter(username=username).exists():
            return Response({"error": "用户已存在"}, status=status.HTTP_400_BAD_REQUEST)

        user = User(username=username)
        user.set_password(password)
        user.save()
        return Response({"success": "用户注册成功"}, status=status.HTTP_201_CREATED)

class UserLoginView(generics.GenericAPIView):
    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(username=username, password=password)

        if user is not None:
            refresh = RefreshToken.for_user(user)
            return Response({
                'refresh': str(refresh),
                'access': str(refresh.access_token),
            })
        return Response({"error": "用户名或密码错误"}, status=status.HTTP_401_UNAUTHORIZED)

添加 URL 路由

authapp/urls.py 文件中添加相应的 URL 路由:

from django.urls import path
from .views import UserRegisterView, UserLoginView

urlpatterns = [
    path('register/', UserRegisterView.as_view(), name='register'),
    path('login/', UserLoginView.as_view(), name='login'),
]

然后在项目的 urls.py 中包含 authapp 的 URL:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('auth/', include('authapp.urls')),
]

测试接口

启动 Django 服务器:

python manage.py runserver

现在,我们可以使用 Postman 或者其他 API 测试工具来测试我们的接口。

  1. 注册用户
  2. POST http://127.0.0.1:8000/auth/register/
  3. Body(JSON): json { "username": "testuser", "password": "testpassword" }

  4. 用户登录

  5. POST http://127.0.0.1:8000/auth/login/
  6. Body(JSON): json { "username": "testuser", "password": "testpassword" }
  7. 成功登录后,你会收到包含 accessrefresh token 的响应。

结论

通过上述步骤,我们成功在 Django 应用中实现了基于 JWT 的用户认证。JWT 提供了一种无状态、安全的方式来管理用户认证,它可以轻松地与大多数现代前端框架集成。希望本文能够帮助你理解和实现 Django 中的 JWT 认证。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部