JWT认证
JWT(JSON Web Token)认证是一种用于客户端和服务器之间传递安全信息的机制。它常用于用户身份验证,特别是在现代的 Web 应用程序和 API 中。下面是 JWT 认证的基本概念、工作流程以及在 Django 中的实现示例。
JWT 概述
JWT 是一个包含了 JSON 对象的字符串,可以安全地在各方之间传递信息。它由三部分组成:
- 头部(Header): 通常包含令牌类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
- 载荷(Payload): 包含声明(claims),可以是关于用户的信息(如用户 ID、角色等)以及其他自定义数据。
- 签名(Signature): 用于确保令牌未被篡改。通过将编码后的头部和载荷与密钥一起进行签名得到。
JWT 的结构如下:
header.payload.signature
工作流程
- 用户登录: 用户通过提供凭据(如用户名和密码)进行登录。
- 生成 JWT: 如果凭据有效,服务器会生成一个 JWT,并将其返回给客户端。
- 存储 JWT: 客户端通常会将 JWT 存储在本地存储或 Cookie 中。
- 发送请求: 客户端在后续请求中将 JWT 作为 Authorization 头的一部分发送给服务器。
- 验证 JWT: 服务器接收到请求后,会验证 JWT 的有效性。如果有效,则允许访问受保护的资源。
- 根据需要更新或撤销: 服务器可以选择在 JWT 到期后要求用户重新登录,或者在某些情况下撤销 JWT。
Django 中的 JWT 认证实现
在 Django 中,可以使用 djangorestframework-simplejwt
库实现 JWT 认证。以下是基本步骤:
1. 安装库
pip install djangorestframework-simplejwt
2. 更新 settings.py
在 settings.py
中添加 rest_framework
和 rest_framework_simplejwt
:
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
3. 配置 URL 路由
在 urls.py
中添加 JWT 相关的路由:
from django.urls import path
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'),
]
4. 获取和使用 JWT
- 获取 Token: 发送 POST 请求到
/api/token/
,并在请求体中提供用户名和密码。
curl -X POST http://localhost:8000/api/token/ -d "username=<your_username>&password=<your_password>"
成功后,会收到一个响应,其中包含 access
和 refresh
token。
- 使用 Token: 在后续请求中,将
access
token 作为 Authorization 头的一部分发送。
curl -H "Authorization: Bearer <your_access_token>" http://localhost:8000/api/protected/
5. 刷新 Token
使用刷新 token 来获取新的访问 token:
curl -X POST http://localhost:8000/api/token/refresh/ -d "refresh=<your_refresh_token>"
总结
JWT 认证为无状态认证提供了简单而安全的解决方案,适用于现代 Web 应用程序和 API。通过在 Django 中使用 djangorestframework-simplejwt
,可以轻松地实现 JWT 认证并管理用户会话。