Django中怎么配置JWT认证

发布时间:2021-07-13 10:46:42 作者:Leah
来源:亿速云 阅读:351
# 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

2.2 添加应用到INSTALLED_APPS

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
]

三、基础配置

3.1 配置DRF认证类

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

3.2 配置URL路由

# 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'),
]

四、自定义JWT配置

4.1 修改默认设置

# 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',),
}

4.2 自定义用户模型支持

如果使用自定义用户模型,需确保:

# models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    # 添加自定义字段
    pass

五、进阶功能实现

5.1 自定义Token Claims

# 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

5.2 自定义认证响应

# views.py
from rest_framework_simplejwt.views import TokenObtainPairView

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

六、前端集成示例

6.1 登录请求示例

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);
});

6.2 带Token的API请求

fetch('/api/protected/', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + localStorage.getItem('access_token')
  }
});

七、安全最佳实践

  1. HTTPS:始终在生产环境使用HTTPS
  2. Token存储
    • 避免XSS:不使用localStorage时考虑HttpOnly Cookie
    • CSRF防护:当使用Cookie时添加CSRF token
  3. 短期有效期:设置合理的token过期时间
  4. 黑名单:实现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."})

八、测试与调试

8.1 单元测试示例

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)

8.2 常见问题排查


九、性能优化建议

  1. 使用非对称算法(RS256)减轻服务端压力
  2. 实现token的分发缓存机制
  3. 对频繁访问的接口添加缓存层
  4. 监控token签发频率防止滥用
# 使用缓存存储高频访问的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)

十、扩展阅读

  1. JWT官方文档
  2. DRF SimpleJWT源码
  3. OAuth2.0与JWT比较
  4. Django安全指南

结语

通过本文的详细讲解,您应该已经掌握了在Django中配置JWT认证的全套方案。从基础配置到高级定制,从安全实践到性能优化,JWT为现代Web应用提供了灵活可靠的认证解决方案。实际项目中应根据具体需求进行调整,并始终将安全性放在首位。 “`

注:本文实际约2300字,您可以通过以下方式扩展: 1. 增加更多配置选项的详细说明 2. 添加完整的项目示例代码 3. 深入讲解JWT的加密原理 4. 补充更多前端框架(如Vue/React)的集成示例

推荐阅读:
  1. 安装配置jwt的token认证
  2. djangorestframework-jwt 用户token认证

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django jwt

上一篇:如何配置RocketMQ生产环境

下一篇:怎么安装本地调用ModelArts平台的Pycharm工具

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》