JWT使用

1.1 安装jwt模块并创建用户APP

# 安装: pip install djangorestframework-jwt
# 添加应用:python manage.py users

1.2 配置settings.py

########### 1、在INSTALLED_APPS中加入'rest_framework.authtoken', #################
INSTALLED_APPS = [
    '''
    'rest_framework.authtoken', 
    '''
]

################### 2、配置jwt验证 ######################
REST_FRAMEWORK = {
    # 身份认证
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

import datetime

JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
AUTH_USER_MODEL='users.User'  # 指定使用users APP中的 model User进行验证

1.3 users/models.py 添加用户认证的User表

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    username = models.CharField(max_length=64, unique=True)
    password = models.CharField(max_length=64)
    phone = models.CharField(max_length=64)
    token = models.CharField(max_length=255)

1.4 users/serializers.py 使用Serializer的create方法创建token

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from rest_framework_jwt.settings import api_settings
from rest_framework import serializers
from users.models import User

class UserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    phone = serializers.CharField()
    token = serializers.CharField(read_only=True)

    def create(self, data):
        user = User.objects.create(**data)
        user.set_password(data.get('password'))
        user.save()
        # 补充生成记录登录状态的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        user.token = token
        return user

1.5 urls.py

from django.contrib import admin
from django.urls import path,re_path,include
from users import views
from rest_framework_jwt.views import obtain_jwt_token  # 验证密码后返回token

urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', views.RegisterView.as_view(), name='register'),  # 注册用户
    path('login/', obtain_jwt_token,name='login'),  # 用户登录后返回token
    path('user/list/', views.UserList.as_view(), name='register'),  # 测试需要携带token才能访问
]

1.6 users/views.py

import json
from rest_framework.views import APIView
from rest_framework.views import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from users.serializers import UserSerializer

# 用户注册
class RegisterView(APIView):
    def post(self, request, *args, **kwargs):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.error, status=400)

# 测试必须携带token才能访问接口
class UserList(APIView):
    permission_classes = [IsAuthenticated]  # 接口中加权限
    authentication_classes = [JSONWebTokenAuthentication]

    def get(self,request, *args, **kwargs):
        print(request.META.get('HTTP_AUTHORIZATION', None))
        return Response({'name':'zhangsan'})
    def post(self,request, *args, **kwargs):
        return Response({'name':'zhangsan'})

enter description here

Hertz JWT 使用通常涉及到在 API 开发中对访问控制、身份验证和授权的管理。JWT (JSON Web Token) 是一种开放标准,用于安全地传输数据作为令牌,并可以在客户端和服务端之间进行验证。当结合 Hertz 框架使用时,可以有效提升 RESTful API 的安全性。 ### Hertz 中 JWT 的应用 1. **身份验证**:通过 JWT 提供了一个自包含的身份认证机制,允许客户端一次性携带身份信息,在请求过程中不需要再次提供凭证。 2. **权限控制**:JWT 可以携带用户角色或其他授权信息,服务端可以根据这些信息做出相应的访问决策。 3. **状态无状态性**:由于 JWT 是自包含的,它消除了对会话存储的需求,使得应用程序更易于分布式部署。 4. **加密与签名**:使用哈希算法如 HMAC 或 RSA 进行签名,保证了数据的完整性和来源的可信度。 ### 实现步骤 #### 客户端生成 JWT 1. 发起一次认证请求给服务器,例如登录请求,返回包含用户名等信息的响应。 ```http POST /login HTTP/1.1 Host: example.com username=example_user&password=example_password ``` 2. 服务器验证凭据并生成 JWT,通常包括 token、过期时间等字段,并将其返回给客户端。 ```json { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", "exp": 1682797600, // 其他信息... } ``` #### 服务端验证 JWT 1. 接收到请求,从请求头(通常是 `Authorization` 字段)提取 JWT。 ```http GET /protected-resource HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 2. 使用相同的密钥解码 JWT,并验证其完整性及有效性。 3. 根据 JWT 中的信息进行授权处理,如检查用户角色、过期时间等。 ### 相关问题: 1. **如何确保 JWT 在传输过程中的安全性?** 使用 HTTPS 协议保护数据传输的安全,防止中间人攻击。同时,可以采用 AES 加密或其他更高级别的加密技术来进一步增强安全性。 2. **如何在 Hertz 框架中集成 JWT 验证机制?** 可以使用第三方库(如 gjwt)简化 JWT 验证的过程,或者自定义实现验证逻辑。这通常涉及拦截 HTTP 请求,读取 JWT使用预设的密钥进行解码和验证。 3. **JWT 的生命周期管理有哪些注意事项?** - 确保设置合理的过期时间,避免长时间有效性的 JWT 被滥用。 - 定期清理无效或已撤销的 JWT,减少资源消耗和潜在的风险。 - 对敏感操作如账户更改密码等,考虑使用短生命周期的刷新令牌而非原始的访问令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值