zoukankan      html  css  js  c++  java
  • #Django djangorestframework-jwt

    Django djangorestframework-jwt

    安装

    pip install djangorestframework-jwt
    

    配置

    REST_FRAMEWORK = {
      	# 默认 jwt 处理方式 
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
            'rest_framework.authentication.SessionAuthentication',
            'rest_framework.authentication.BasicAuthentication',
        ),
    }
    
    import datetime
    JWT_AUTH = {
      	# 过期时间 1天
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    }
    

    路由

    from django.urls import path
    from rest_framework_jwt.views import obtain_jwt_token
    
    urlpatterns = [
        # 登录
        path('login/',obtain_jwt_token)
    ]
    

    访问路由输入账号和密码,

    image-20200826102952132

    响应

    { "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InJvb3QiLCJleHAiOjE1OTg0OTU0MjgsImVtYWlsIjoiIn0.c08D8vR8bDlvuvohlRvmqzeoEZww8W4O8D2y_5F5SGM",}
    

    自定义响应信息

    首先我们考虑 这是DRF-jwt 默认生成token的方式 ,我觉的不够 ,因为只是给返回了token,我还想要 用户名和 用户id。那么我们就得需要自定义了。

    DRF-jwt其实已经给我提供好了结口。

    配置

    JWT_RESPONSE_PAYLOAD_HANDLER

    JWT_AUTH = {
        # jwt 过期时间
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
        # 自定义 响应信息
        'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler'
    }
    

    在当前app下新建utils.py

    def jwt_response_payload_handler(token, user=None, request=None):
        '''
        自定义返回认证信息
        :param token: jwt认证token
        :param user: 用户id
        :param request: 请求对象
        :return:
        '''
        return {
            "token": token,
            'id': user.id,
            'username': user.username
        }
    

    我们在发请求看一下

    image-20200826103742108

    自定义多条件登录

    这会我们在考虑一下现在我们只能用用户名登录,当前用户数据模型是有手机号的。所以我想用手机号也能登录,所以我要自定义,验证规则。

    def get_user_by_account(username):
        return User.objects.filter(Q(username=username) | Q(mobile=username)).first()
    
    
    class UsernameMobileAuthBackend(ModelBackend):
        '''
        自定义 登录验证 多加了一个 mobile(手机号)
        '''
    		# authenticate 重写
        def authenticate(self, request, username=None, password=None, **kwargs):
            user = get_user_by_account(username)
            print(user,'>>>>>>>>>>>>>')
            if user is not None and user.check_password(password):
                return user
    

    配置

    # jwt 自定义用户数据模型
    AUTHENTICATION_BACKENDS = [
        'users.utils.UsernameMobileAuthBackend',
    ]
    
  • 相关阅读:
    PHP 处理接口保证数据安全性
    zeromq使用模式实验总结
    文件描述符设置
    配置openssh实现sftp远程文件上传
    系统信号(signal)与其他(定时器,退出清理等)
    Python Subprocess Popen 管道阻塞问题分析解决
    fastcgi协议之一:定义
    命名空间与自动加载机制
    PSR规范
    细说php的异常和错误处理机制
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/13563770.html
Copyright © 2011-2022 走看看