在Django中使用 rest_framework_jwt
获取访问令牌和刷新令牌的功能,可以通过自定义视图和序列化器来实现。rest_framework_jwt
本身不直接支持刷新令牌的功能,但你可以通过扩展其功能来实现这一点。
以下是一个示例,展示如何在Django中一次获取访问令牌和刷新令牌。
首先,确保你已经安装了 djangorestframework
和 djangorestframework-jwt
:
pip install djangorestframework djangorestframework-jwt
在你的 settings.py
文件中,添加 JWT 配置:
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_jwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}
创建一个自定义视图和序列化器来处理访问令牌和刷新令牌的生成。
创建一个新的序列化器来处理用户登录并返回访问令牌和刷新令牌。
# serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.serializers import JSONWebTokenSerializer
class CustomJWTSerializer(JSONWebTokenSerializer):
def validate(self, attrs):
credentials = {
'username': attrs.get('username'),
'password': attrs.get('password')
}
if all(credentials.values()):
user = authenticate(**credentials)
if user:
if not user.is_active:
msg = 'User account is disabled.'
raise serializers.ValidationError(msg)
payload = api_settings.JWT_PAYLOAD_HANDLER(user)
token = api_settings.JWT_ENCODE_HANDLER(payload)
refresh_token = api_settings.JWT_ENCODE_HANDLER(payload)
return {
'token': token,
'refresh_token': refresh_token,
'user': user
}
else:
msg = 'Unable to log in with provided credentials.'
raise serializers.ValidationError(msg)
else:
msg = 'Must include "username" and "password".'
raise serializers.ValidationError(msg)
创建一个新的视图来处理登录请求并返回访问令牌和刷新令牌。
# views.py
from rest_framework_jwt.views import ObtainJSONWebToken
from .serializers import CustomJWTSerializer
class CustomObtainJSONWebToken(ObtainJSONWebToken):
serializer_class = CustomJWTSerializer
在你的 urls.py
文件中添加新的 URL 路由来处理登录请求。
# urls.py
from django.urls import path
from .views import CustomObtainJSONWebToken
urlpatterns = [
path('api-token-auth/', CustomObtainJSONWebToken.as_view(), name='token_obtain_pair'),
]
现在,你可以通过发送 POST 请求到 /api-token-auth/
来获取访问令牌和刷新令牌。
请求示例:
curl -X POST -d "username=<your_username>&password=<your_password>" http://localhost:8000/api-token-auth/
响应示例:
{
"token": "<access_token>",
"refresh_token": "<refresh_token>",
"user": {
"username": "<your_username>",
"email": "<your_email>",
...
}
}
通过自定义视图和序列化器,你可以在Django中一次获取访问令牌和刷新令牌。这个示例展示了如何扩展 rest_framework_jwt
的功能,以满足你的需求。根据你的具体需求,你可能需要进一步调整和扩展这个示例。
领取专属 10元无门槛券
手把手带您无忧上云