在现代 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
文件中添加 authapp
和 rest_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 测试工具来测试我们的接口。
- 注册用户:
- POST
http://127.0.0.1:8000/auth/register/
-
Body(JSON):
json { "username": "testuser", "password": "testpassword" }
-
用户登录:
- POST
http://127.0.0.1:8000/auth/login/
- Body(JSON):
json { "username": "testuser", "password": "testpassword" }
- 成功登录后,你会收到包含
access
和refresh
token 的响应。
结论
通过上述步骤,我们成功在 Django 应用中实现了基于 JWT 的用户认证。JWT 提供了一种无状态、安全的方式来管理用户认证,它可以轻松地与大多数现代前端框架集成。希望本文能够帮助你理解和实现 Django 中的 JWT 认证。