zoukankan      html  css  js  c++  java
  • Django--JWT认证

    1.安装配置

    1.1 下载

    pip install djangorestframework-jwt
    

    1.2配置settings.py

    • 注册应用
    INSTALLED_APPS = [
        'rest_framework_jwt',
    ]
    

    1.3配置JWT验证

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  # 在 DRF中配置JWT认证
        ],
    
    }
    # jwt载荷中的有效期设置
    JWT_AUTH = {
        # token前缀:headers中 Authorization 值的前缀
        'JWT_AUTH_HEADER_PREFIX': 'JWT',
        # token有效期:一天有效
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    }
    

    2.注册用户

    2.1重写User表

    from django.contrib.auth.models import AbstractUser
    
    # 用户表
    class User(AbstractUser):
        email = models.CharField(max_length=255,null=True,blank=True)
        phone = models.CharField(max_length=255,null=True,blank=True)
        
        class Meta:
            db_table = 'tb_user'
    

    2.2生成Token

    • 创建MybaseView.py
    from rest_framework_jwt.settings import api_settings
    
    def creare_token(user):
        # 生成jwt_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)
        print(token)
        return token
    

    2.3序列化器

    from .models import *
    from rest_framework import serializers
    from django.contrib.auth.hashers import make_password
    from .MybaseView import creare_token
    
    
    # 注册用户
    class CreateUserSerializers(serializers.Serializer):
        username = serializers.CharField()
        password = serializers.CharField()
        email = serializers.CharField()
        phone = serializers.CharField()
        token = serializers.CharField(read_only=True)
    
        def create(self, validated_data):
            user = User.objects.create(**validated_data)
            # 密码加密
            password = make_password(validated_data.get('password'))
            user.password = password
            user.save()
            token = creare_token(user)
            user.token = token
            return user
    

    2.4views.py

    # 注册用户
    class UserView(APIView):
        def post(self, request):
            data = request.data
            # print(data)
    
            if not all(['username', 'password', 'password2', 'email', 'phone']):
                return Response({'code': 202, 'msg': '参数不全'})
    
            if data['password'] != data['password2']:
                return Response({'code': 204, 'msg': '两次密码不一致'})
    
            try:
                user = CreateUserSerializers(data=data)
                user.is_valid()
                print(user.errors)
                user.save()
                return Response({'code': 200, 'msg': '创建用户成功', 'data': user.data})
            except Exception as e:
                return Response({'code': 201, 'msg': '创建失败,请重试'})
    

    2.5 配置路由

    urlpatterns = [
        path('user/', views.UserView.as_view()),
    ]
    

    2.6Postman测试


    3.用户登录

    3.1views.py

    # 用户登录返回数据
    def jwt_response_payload_handler(token, user=None, request=None):
        return {
            'userid': user.id,
            'user': user.username,
            'phone': user.phone,
            'token': token
        }
    

    3.2配置路由

    om rest_framework_jwt.views import obtain_jwt_token
    
    
    urlpatterns = [
        path('user/', views.UserView.as_view()),     # 注册
        path('login/', obtain_jwt_token),		 # 登录
    ]
    

    3.3Postman测试


    4.测试携带token才可访问接口

    4.1views.py

    # 登录状态才可查询用户
    class UserInfoView(APIView):
        permission_classes = [IsAuthenticated]  # 接口中加权限
        authentication_classes = [JSONWebTokenAuthentication]
        def get(self, request):
            user = User.objects.all()
            obj = UserInfoSerializers(user, many=True)
            return Response({'code': 200, 'msg': '查询成功', "data": obj.data})
    

    4.2序列化器

    class UserInfoSerializers(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('id','username','phone','email')
    

    4.3配置路由

    urlpatterns = [
        path('user/', views.UserView.as_view()),			# 注册
        path('login/', obtain_jwt_token),				# 登录
        path('get_user/', views.UserInfoView.as_view()),	        # 测试登录状态访问接口
    ]
    

    4.4Postman测试

  • 相关阅读:
    NGINX下配置404错误页面的方法分享
    mysql 统计
    nginx日志中访问最多的100个ip及访问次数
    ubuntu下完全安装mcrypt
    ngxtop:在命令行实时监控 Nginx 的神器
    AngularJs 返回上一页
    nginx 报错 upstream timed out (110: Connection timed out)解决方案
    IAP 破解漏洞验证
    AceAdmin-v1.4.0 下载
    TP QQ 微信 微博登录
  • 原文地址:https://www.cnblogs.com/mbitions/p/13916447.html
Copyright © 2011-2022 走看看