zoukankan      html  css  js  c++  java
  • 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  为我们做的很多事情。

  • 相关阅读:
    easyui datagride 两种查询方式
    SharePoint常用目录介绍
    sharepoint 2013 入门1_ 建立一个网页程序
    Windows2012 显示我的电脑
    你知道 react-color 的实现原理吗
    如何实现 Promise 池
    如何使 pdf 文件在浏览器里面直接下载而不是打开
    macOS 安装 oh-my-zsh 之后 node 失效的问题
    剑指offer[47]——求1+2+3+...+n
    剑指offer[46]——孩子们的游戏(圆圈中最后剩下的数)
  • 原文地址:https://www.cnblogs.com/lvye001/p/10149319.html
Copyright © 2011-2022 走看看