如果不使用 Django REST framework 结构来实验 JWT(JSON Web Token),可以使用纯 Django 进行实现。这涉及到创建自定义的认证和授权机制。以下是一个简单的示例,展示了如何在 Django 中实现 JWT 认证。
1. 安装依赖
首先,安装 PyJWT
库:
pip install PyJWT
2. 创建生成和验证 JWT 的实用函数
在一个新的文件(例如 utils.py
)中创建生成和验证 JWT 的函数:
# utils.py
import jwt
from django.conf import settings
from datetime import datetime, timedelta
def generate_jwt(user):
payload = {
'user_id': user.id,
'username': user.username,
'exp': datetime.utcnow() + timedelta(minutes=5),
'iat': datetime.utcnow(),
}
token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
return token
def decode_jwt(token):
try:
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
return payload
except jwt.ExpiredSignatureError:
return None
except jwt.InvalidTokenError:
return None
3. 创建登录视图
在您的 Django 应用中创建一个视图,允许用户使用用户名和密码登录并生成 JWT:
# views.py
from django.contrib.auth import authenticate
from django.http import JsonResponse
from .utils import generate_jwt
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user is not None:
token = generate_jwt(user)
return JsonResponse({'token': token})
else:
return JsonResponse({'error': 'Invalid credentials'}, status=400)
return JsonResponse({'error': 'Only POST method is allowed'}, status=405)
4. 创建一个装饰器来保护视图
为了保护某些视图,您可以创建一个装饰器来验证请求中的 JWT:
# decorators.py
from django.http import JsonResponse
from .utils import decode_jwt
def jwt_required(view_func):
def _wrapped_view(request, *args, **kwargs):
token = request.META.get('HTTP_AUTHORIZATION')
if token is None or not token.startswith('Bearer '):
return JsonResponse({'error': 'Token missing'}, status=401)
token = token.split(' ')[1]
payload = decode_jwt(token)
if payload is None:
return JsonResponse({'error': 'Invalid or expired token'}, status=401)
request.user_id = payload['user_id']
request.username = payload['username']
return view_func(request, *args, **kwargs)
return _wrapped_view
5. 创建一个受保护的视图
使用上面的装饰器来保护视图:
# views.py
from django.http import JsonResponse
from .decorators import jwt_required
@jwt_required
def protected_view(request):
return JsonResponse({'message': f'Hello, {request.username}! This is a protected view.'})
6. 配置 URL 路由
在您的 urls.py
文件中配置这些视图的路由:
# urls.py
from django.urls import path
from .views import login_view, protected_view
urlpatterns = [
path('login/', login_view, name='login'),
path('protected/', protected_view, name='protected'),
]
7. 测试
启动 Django 开发服务器:
python manage.py runserver
通过 POST
请求到 /login/
获取 JWT:
POST /login/
{
"username": "your_username",
"password": "your_password"
}
成功获取令牌后,使用获取到的 access token
访问受保护的视图:
GET /protected/
Authorization: Bearer your_access_token
这样,您就实现了一个不依赖 Django REST framework 的 JWT 认证系统。如果有任何问题或需要进一步的帮助,请告诉我!