#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',
]
原文地址:https://www.cnblogs.com/jiangchunsheng/p/13563770.html