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',
    ]
    
  • 相关阅读:
    Python 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/13563770.html
Copyright © 2011-2022 走看看