当前位置:   article > 正文

如何在 Django 中实现 JWT 认证

如何在 Django 中实现 JWT 认证

如果不使用 Django REST framework 结构来实验 JWT(JSON Web Token),可以使用纯 Django 进行实现。这涉及到创建自定义的认证和授权机制。以下是一个简单的示例,展示了如何在 Django 中实现 JWT 认证。

1. 安装依赖

首先,安装 PyJWT 库:

pip install PyJWT
  • 1

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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.'})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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'),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

7. 测试

启动 Django 开发服务器:

python manage.py runserver
  • 1

通过 POST 请求到 /login/ 获取 JWT:

POST /login/
{
    "username": "your_username",
    "password": "your_password"
}
  • 1
  • 2
  • 3
  • 4
  • 5

成功获取令牌后,使用获取到的 access token 访问受保护的视图:

GET /protected/
Authorization: Bearer your_access_token
  • 1
  • 2

这样,您就实现了一个不依赖 Django REST framework 的 JWT 认证系统。如果有任何问题或需要进一步的帮助,请告诉我!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/893762
推荐阅读
相关标签
  

闽ICP备14008679号