如何在Django中集成JWT

JWT简介

JWT(JSON Web Token)是一种流行的跨域认证解决方案。它可以在令牌中安全地传输用户身份信息,实现无状态认证机制。

优点:

  • 跨域认证,适用于分布式微服务
  • 减少数据库查询,优化性能
  • 更好的托管和扩展性

结构:

1
header.payload.signature
  • header 中描述签名算法等元数据
  • payload 中包含自定义用户数据,如用户名、角色等
  • signature 通过头和载荷以及密钥签名,保证完整和可验证

这一部分具体内容可以参考:https://www.bilibili.com/video/BV1Sz4y1o7E8 我以前推荐过这个教程。

通过这种方式,JWT可以将用户信息安全地在客户端和服务端传递。

在Django中使用JWT

JWT在Django有多种第三方包可以实现,我这里选择使用比较常用的simplejwt.

1. 安装

1
pip install djangorestframework_simplejwt

2. 配置

在settings.py中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INSTALLED_APPS = [ 
# ...
'rest_framework',
'rest_framework_simplejwt',
# ...
]

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
]
}

SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

注意: 这里还需要配置REST_FRAMEWORK本身的认证相关的配置

3. 添加认证接口

我们需要为获取tokens的视图配置URLs。这些视图已经被 djangorestframework_simplejwt 提供了,我们只需将其添加到urls.py文件即可:

1
2
3
4
5
6
7
8
9
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'),
# ...
]

客户端使用JWT

1. 获取新token

发送用户名密码,获取access和refresh token:

1
2
3
4
5
6
`import requests 
url = '/api/token/'
data = {'username': 'user1', 'password': 'secure-password'}
response = requests.post(url, data=data)
access_token = response.json()['access']
refresh_token = response.json()['refresh']

保存token以供后续使用。

2. 调用API

在请求头中提供jwt token:

1
2
3
headers = {'Authorization': f'Bearer {access_token}'}

response = requests.get('/api/user/', headers=headers)

3. 刷新token

access token过期后,使用refresh token获取新的access token:

1
2
3
4
5
url = '/api/token/refresh/'
data = {'refresh': refresh_token}

response = requests.post(url, data=data)
new_access_token = response.json()['access']

重复步骤2,3即可使用新的token调用API。

至此,我们了解了如何在Django REST框架中集成JWT认证,实现基于token的API接口访问控制。JWT可以提供更强大的用户认证方案。