Django REST Framework JWT 认证详解与实践指南
django-rest-framework-jwt 项目地址: https://gitcode.com/gh_mirrors/dja/django-rest-framework-jwt
什么是 JWT 认证
JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。在 Django REST 框架中,JWT 认证提供了一种无状态的认证机制,特别适合现代 Web 应用和 API 服务。
核心特性
- 无状态认证:服务器不需要存储会话信息,所有必要信息都包含在令牌中
- 跨域支持:适合前后端分离架构和微服务架构
- 安全可靠:基于数字签名,可验证内容未被篡改
- 灵活过期:支持令牌刷新机制,提升用户体验
安装与基础配置
安装步骤
使用 pip 包管理器安装:
pip install djangorestframework-jwt
基本配置
在 settings.py 中添加 JWT 认证类:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
URL 配置
在 urls.py 中添加获取令牌的端点:
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('api-token-auth/', obtain_jwt_token),
]
使用 JWT 认证
获取令牌
客户端可以通过两种方式获取 JWT 令牌:
- 表单提交:
curl -X POST -d "username=admin&password=123456" http://localhost:8000/api-token-auth/
- JSON 提交:
curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"123456"}' http://localhost:8000/api-token-auth/
使用令牌访问受保护 API
获取到令牌后,在请求头中加入 Authorization:
curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-api/
高级功能
令牌刷新机制
启用令牌刷新功能需要在 settings.py 中配置:
JWT_AUTH = {
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
}
然后添加刷新端点:
from rest_framework_jwt.views import refresh_jwt_token
urlpatterns = [
path('api-token-refresh/', refresh_jwt_token),
]
使用方式:
curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-refresh/
令牌验证
在微服务架构中,可以添加验证端点:
from rest_framework_jwt.views import verify_jwt_token
urlpatterns = [
path('api-token-verify/', verify_jwt_token),
]
验证方式:
curl -X POST -H "Content-Type: application/json" -d '{"token":"<EXISTING_TOKEN>"}' http://localhost:8000/api-token-verify/
安全配置详解
密钥配置
JWT_AUTH = {
'JWT_SECRET_KEY': 'your-secret-key', # 签名密钥
'JWT_ALGORITHM': 'HS256', # 加密算法
'JWT_VERIFY': True, # 验证签名
'JWT_VERIFY_EXPIRATION': True, # 验证过期时间
'JWT_LEEWAY': 0, # 时间容差
'JWT_EXPIRATION_DELTA': timedelta(seconds=300), # 令牌有效期
}
高级安全选项
- RSA 非对称加密:
JWT_AUTH = {
'JWT_PUBLIC_KEY': rsa_public_key,
'JWT_PRIVATE_KEY': rsa_private_key,
'JWT_ALGORITHM': 'RS256',
}
- 用户级密钥:
def get_user_secret_key(user):
return user.secret_key
JWT_AUTH = {
'JWT_GET_USER_SECRET_KEY': get_user_secret_key
}
自定义扩展
自定义认证类
如果需要从查询参数获取 JWT:
class QueryParamJWTAuth(BaseJSONWebTokenAuthentication):
def get_jwt_value(self, request):
return request.query_params.get('token')
自定义响应内容
def custom_response_handler(token, user=None, request=None):
return {
'token': token,
'user_id': user.id,
'username': user.username
}
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': custom_response_handler
}
最佳实践建议
- 生产环境必须使用 HTTPS:防止令牌被截获
- 合理设置令牌有效期:平衡安全性和用户体验
- 实现令牌刷新机制:避免频繁要求用户重新登录
- 敏感操作要求重新认证:即使有有效令牌也应要求密码确认
- 记录令牌使用情况:便于安全审计和异常检测
常见问题解决方案
- 令牌过期处理:实现自动刷新逻辑或优雅的重新登录流程
- 跨域问题:确保正确配置 CORS 和令牌传输方式
- 移动端适配:考虑使用安全存储保存令牌
- 多设备登录:可以通过 payload 区分设备来源
通过本文的详细介绍,开发者可以全面了解如何在 Django REST 框架中实现 JWT 认证,并根据实际需求进行灵活配置和扩展。
django-rest-framework-jwt 项目地址: https://gitcode.com/gh_mirrors/dja/django-rest-framework-jwt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考