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凭证方式,实现前后端分离

JWT什么鬼?django中使用JWT

Django-Graphene: 没有名为'graphql_jwt'的模块。

状态保持login()

添加到后台堆栈时如何保持片段状态?

Django视图——状态保持(SESSION)