rest_framework_simplejwt
)rest_framework_simplejwt
pip install rest_framework_simplejwt
settings.py
# settings.py
INSTALLED_APPS = [
# 其他应用
'rest_framework',
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # 配置访问令牌的过期时间
'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 配置刷新令牌的过期时间
'ROTATE_REFRESH_TOKENS': True, # 刷新时是否生成新的 refresh token
'BLACKLIST_AFTER_ROTATION': True, # 是否在刷新后废弃旧的 refresh token
'ALGORITHM': 'HS256', # 使用的加密算法 (HS256 或 RS256)
'SIGNING_KEY': 'your-secret-key', # 设置签名密钥
'VERIFYING_KEY': None, # 如果使用公钥算法,可以配置验证密钥
}
# 如果有自定义用户模型
AUTH_USER_MODEL = 'user.CustomUser'
DEFAULT_AUTHENTICATION_CLASSES
DEFAULT_PERMISSION_CLASSES
两者的关系:
DEFAULT_AUTHENTICATION_CLASSES
负责确定用户“是谁”。DEFAULT_PERMISSION_CLASSES
负责判断用户是否有“权限”访问资源。urls.py
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'),
]
access
和 refresh
token/api/token/
,携带 username
和 password
:请求示例:
POST /api/token/
Content-Type: application/json
{
"username": "your_username",
"password": "your_password"
}
返回示例:
{
"access": "your_access_token",
"refresh": "your_refresh_token"
}
access
token/api/token/refresh/
,携带 refresh
token:请求示例:
POST /api/token/refresh/
Content-Type: application/json
{
"refresh": "your_refresh_token"
}
返回示例:
{
"access": "new_access_token"
}
Authorization: Bearer
,例如:GET /protected/api/endpoint/
Authorization: Bearer your_access_token
在某些情况下,您可能需要动态生成 Token 和 Refresh,或者在后端提供一个用户登录接口直接返回这些信息。以下是一个示例:
from rest_framework_simplejwt.tokens import RefreshToken
def generate_tokens_for_user(user):
"""
为指定用户生成 Access Token 和 Refresh Token。
"""
refresh = RefreshToken.for_user(user)
return {
'refresh': str(refresh),
'access': str(refresh.access_token)
}
from django.contrib.auth import authenticate, login
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
class LoginView(APIView):
"""
用户登录视图,返回 Access 和 Refresh Token。
"""
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
tokens = generate_tokens_for_user(user)
return Response(tokens, status=status.HTTP_200_OK)
else:
return Response({"detail": "Invalid credentials."}, status=status.HTTP_400_BAD_REQUEST)
POST /api/login/
Content-Type: application/json
{
"username": "test_user",
"password": "test_password"
}
{
"refresh": "your_refresh_token",
"access": "your_access_token"
}
通过这种方式,您可以在登录时动态生成和返回 Token,以供客户端使用。