赞
踩
如果不使用 Django REST framework 结构来实验 JWT(JSON Web Token),可以使用纯 Django 进行实现。这涉及到创建自定义的认证和授权机制。以下是一个简单的示例,展示了如何在 Django 中实现 JWT 认证。
首先,安装 PyJWT
库:
pip install PyJWT
在一个新的文件(例如 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
在您的 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)
为了保护某些视图,您可以创建一个装饰器来验证请求中的 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
使用上面的装饰器来保护视图:
# 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.'})
在您的 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'),
]
启动 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 认证系统。如果有任何问题或需要进一步的帮助,请告诉我!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。