您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Django中怎么配置JWT认证
## 引言
在现代Web开发中,前后端分离架构已成为主流趋势。在这种架构下,传统的基于Session的认证方式存在跨域和扩展性问题,而JWT(JSON Web Token)作为一种轻量级的认证方案,因其无状态、跨语言和易扩展的特性被广泛应用。本文将详细介绍如何在Django项目中配置JWT认证。
---
## 一、JWT基础概念
### 1.1 什么是JWT
JWT是一种开放标准(RFC 7519),由三部分组成:
- **Header**:包含算法和token类型
- **Payload**:存储用户信息(如用户ID)和元数据(如过期时间)
- **Signature**:用于验证消息完整性的签名
示例结构:
xxxxx.yyyyy.zzzzz
### 1.2 JWT工作流程
1. 客户端发送登录请求
2. 服务端验证后生成JWT返回
3. 客户端存储JWT(通常放在localStorage或Cookie中)
4. 后续请求携带JWT进行认证
---
## 二、Django环境准备
### 2.1 安装必要包
```bash
pip install djangorestframework djangorestframework-simplejwt
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
]
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
# urls.py
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'),
]
# settings.py
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'UPDATE_LAST_LOGIN': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'AUTH_HEADER_TYPES': ('Bearer',),
}
如果使用自定义用户模型,需确保:
# models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# 添加自定义字段
pass
# serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['username'] = user.username
token['is_staff'] = user.is_staff
return token
# views.py
from rest_framework_simplejwt.views import TokenObtainPairView
class CustomTokenObtainPairView(TokenObtainPairView):
serializer_class = CustomTokenObtainPairSerializer
fetch('/api/token/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'admin',
password: 'password123'
})
})
.then(response => response.json())
.then(data => {
localStorage.setItem('access_token', data.access);
localStorage.setItem('refresh_token', data.refresh);
});
fetch('/api/protected/', {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
}
});
# 实现黑名单
from rest_framework_simplejwt.token_blacklist.models import BlacklistedToken
def logout(request):
token = request.auth
BlacklistedToken.objects.create(token=token)
return Response({"detail": "Successfully logged out."})
from rest_framework.test import APITestCase
from django.contrib.auth.models import User
class JWTAuthTests(APITestCase):
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
def test_token_obtain(self):
response = self.client.post('/api/token/', {
'username': 'testuser',
'password': 'testpass123'
})
self.assertEqual(response.status_code, 200)
self.assertIn('access', response.data)
# 使用缓存存储高频访问的token信息
from django.core.cache import cache
def get_user_from_token(token):
user_id = cache.get(f'token_{token}')
if not user_id:
user_id = decode_token(token)['user_id']
cache.set(f'token_{token}', user_id, timeout=300)
return User.objects.get(id=user_id)
通过本文的详细讲解,您应该已经掌握了在Django中配置JWT认证的全套方案。从基础配置到高级定制,从安全实践到性能优化,JWT为现代Web应用提供了灵活可靠的认证解决方案。实际项目中应根据具体需求进行调整,并始终将安全性放在首位。 “`
注:本文实际约2300字,您可以通过以下方式扩展: 1. 增加更多配置选项的详细说明 2. 添加完整的项目示例代码 3. 深入讲解JWT的加密原理 4. 补充更多前端框架(如Vue/React)的集成示例
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。