如何在 Django 中实现 JWT 认证

如果不使用 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 认证系统。如果有任何问题或需要进一步的帮助,请告诉我!

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值