django通过使用jwt模块实现状态保持
Posted zbllly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django通过使用jwt模块实现状态保持相关的知识,希望对你有一定的参考价值。
第一步:安装jwt
pip install djangorestframework-jwt
第二步:settings/dev的配置文件配置
REST_FRAMEWORK = { # 认证配置 ‘DEFAULT_AUTHENTICATION_CLASSES‘: ( ‘rest_framework_jwt.authentication.JSONWebTokenAuthentication‘, ‘rest_framework.authentication.SessionAuthentication‘, ‘rest_framework.authentication.BasicAuthentication‘, ), }
解释:定义drf配置全局默认的认证方案
第三步:
JWT_AUTH = { # 重新定义jwt认证成功后返回的数据 ‘JWT_RESPONSE_PAYLOAD_HANDLER‘:‘users.utils.jwt_response_payload_handler‘, ‘JWT_EXPIRATION_DELTA‘: datetime.timedelta(days=1), #定义token过期时间为一天 }
解释:第一个参数,重新定义jwt认证成功后返回的数据(jwt默认只返回token,我们在users.utils 下定义该类认证成功后 增加返回字段信息)
def jwt_response_payload_handler(token, user=None, request=None): """ 自定义jwt认证成功返回数据 """ return { ‘token‘: token, ‘user_id‘: user.id, ‘username‘: user.username }
第四步:因为jwt 只对用户名进行认证,我们重写认证方式,增加手机号认证,上代码:
setting.py继续配置:
#在配置文件中告知Django使用我们自定义的认证后端 AUTHENTICATION_BACKENDS = [ ‘users.utils.UsernameMobileAuthenticate‘, ]
user.utils下自定义类重写认证方式:
from django.contrib.auth.backends import ModelBackend from .models import User from django.db.models import Q class UsernameMobileAuthenticate(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = User.objects.get(Q(username=username)|Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None
第五步:登录时post请求url设置:
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r‘^login/$‘,obtain_jwt_token), ]
就这样我们就可以完成登录校验
下面举个例子,注册成功后后台生成token 并返回前端,用户直接登录即可
注册时 创建用户序列化器增加字段:
from rest_framework_jwt.settings import api_settings #导入该模块 class CreateUserSerializer(serializers.ModelSerializer): token = serializers.CharField(label=‘登录状态token‘, read_only=True) # 增加token字段 username = ... password = ... ‘‘‘‘‘‘ user = super(CreateUserSerializer,self).create(validated_data) user.set_password(validated_data[‘password‘]) user.save() # 补充生成记录登录状态的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) # 将token保存到user对象中,随着返回值返回给前端 user.token = token return user
注:以上代码是获取token 生成token
我们再来看看前端接收,
LocalStorage.token=response.data.token sessionStorage.token=response.data.token #我们将后台返回的token 保存在本地或者session即可:
然后我们请求后台是请求体携带即可:
这样当我们登录成功后 ,我们后台 request,user 就可以输出当前用户是谁
这些都是jwt 为我们做的很多事情。
以上是关于django通过使用jwt模块实现状态保持的主要内容,如果未能解决你的问题,请参考以下文章
Django 集成JWT 基于Token凭证方式,实现前后端分离