Django REST Framework JWT 认证详解
什么是 JWT 认证
JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。在 Django REST Framework 中使用 JWT 认证,可以构建无状态的 API 服务,特别适合现代前后端分离的应用架构。
核心特性
- 无状态认证:服务器不需要存储会话信息,所有必要信息都包含在令牌中
- 跨域支持:适合微服务架构和跨域 API 调用
- 安全可靠:基于数字签名,可验证内容未被篡改
安装与基础配置
安装步骤
使用 pip 安装 Django REST Framework JWT 包:
pip install djangorestframework-jwt
基础配置
在 Django 项目的 settings.py 文件中添加以下配置:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
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 -H "Content-Type: application/json" -d '{"username":"admin","password":"password123"}' http://localhost:8000/api-token-auth/
成功后会返回类似以下的响应:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
使用令牌访问受保护 API
获取令牌后,需要在请求头中添加 Authorization 字段:
curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
高级功能
令牌刷新机制
当 JWT_ALLOW_REFRESH
设置为 True 时,可以配置令牌刷新功能:
- 首先在 settings.py 中启用:
JWT_AUTH = {
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
}
- 然后在 urls.py 中添加刷新路由:
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': settings.SECRET_KEY, # 签名密钥
'JWT_ALGORITHM': 'HS256', # 加密算法
'JWT_VERIFY_EXPIRATION': True, # 是否验证过期时间
'JWT_EXPIRATION_DELTA': timedelta(seconds=300), # 令牌有效期
'JWT_AUTH_HEADER_PREFIX': 'JWT', # 认证头前缀
}
算法选择建议
- HS256:对称加密,适合单服务架构
- RS256:非对称加密,适合分布式系统
- ES256:基于椭圆曲线的加密,安全性更高
自定义扩展
自定义令牌生成
可以手动生成令牌用于特殊场景:
from rest_framework_jwt.settings import api_settings
payload = api_settings.JWT_PAYLOAD_HANDLER(user)
token = api_settings.JWT_ENCODE_HANDLER(payload)
自定义认证方式
如果需要从查询参数获取令牌,可以创建自定义认证类:
class JSONWebTokenAuthenticationQS(BaseJSONWebTokenAuthentication):
def get_jwt_value(self, request):
return request.query_params.get('jwt')
最佳实践建议
- 始终使用 HTTPS:防止令牌被截获
- 合理设置有效期:平衡安全性和用户体验
- 实现令牌刷新:提升用户体验而不降低安全性
- 监控令牌使用:及时发现异常情况
- 考虑使用双令牌机制:访问令牌+刷新令牌的组合
通过合理配置 Django REST Framework JWT,可以构建既安全又高效的身份认证系统,满足现代 Web 应用的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考