#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)
]
访问路由输入账号和密码,
响应
{ "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
}
我们在发请求看一下
自定义多条件登录
这会我们在考虑一下现在我们只能用用户名登录,当前用户数据模型是有手机号的。所以我想用手机号也能登录,所以我要自定义,验证规则。
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',
]