• jwt认证


    jwt认证

    ​ jwt:json web token

    ​ 解释:加密字符串的原始数据是json,后台产生,通过web传输给前台存储

    一、格式

    ​ jwt = base64(头).base(载荷).hash256(base64(头部).base(载荷).密钥)

    ​ baes64是可逆算法,hash256是不可逆算法

    ​ 密钥是固定的字符串,保存在服务器中

    二、内容

    ​ 头:储存基本信息,也可以为空。内容有加密方式、公司信息、项目组信息等等

    ​ 载荷:储存核心信息,内容有用户信息、过期时间等等。

    ​ 签名:保障数据安全,格式为头加密结果+载荷加密结果+服务器秘钥 的md5加密结果

    三、jwt模块安装

    ​ 安装:

    pip install djangorestframework-jwt
    

    ​ 模块包:

    rest_framework_jwt
    

    ​ 认证规则:

    ​ 后台签发token -> 前台存储 -> 发送需要认证的请求带着token -> 后台校验得到合法的用户。

    ​ 注意:后台一定要保障服务器密钥的安全性(是jwt唯一的安全保障)

    四、项目

    ​ 配置信息:

    import datetime
    JWT_AUTH = {
     # 过期时间
     'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
     # 自定义认证结果:见下方序列化user和自定义response
     'JWT_RESPONSE_PAYLOAD_HANDLER': 'user.utils.jwt_response_payload_handler',
    }
    

    ​ 序列化user:serializers.py

    from rest_framework import serializers
    from . import models
    
    class UserModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = models.User
            fields = ['username']
    

    ​ 自定义response:utils.py

    from .serializers import UserModelSerializers
    def jwt_response_payload_handler(token, user=None, request=None)
    	return {
            'status': 0,
            'msg': 'ok',
            'data': {
                'token': token,
                'user': UserModelSerializers(user).data
            }
        }
    

    ​ 基于drf-jwt的全局认证:authentications.py

    import jwt
    from rest_framework.exceptions import AuthenticationFailed
    from rest_framework_jwt.authentication import jwt_decode_handler
    from rest_framework_jwt.authentication import get_authorization_header
    from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
    
    
    class JSONWebTokenAuthentication(BaseJSONWebTokenAuthentication):
    	def authenticate(self, request):
            jwt_value = get_authorization_header(request)
            if not jwt_value:
                raise AutnenticationFailed('Autnorization 字段是必有得')
            try:
                payload = jwt_decode_handler(jwt_value)
            except jwt.ExpiredSignature
            	raise AutnenticationFailed('签名过期')
            except jwt.InvalidTokenError
            	raise AutnenticationFailed('非法用户')
            user = self.authenticate_credentials(payload)
            
            return user, jwt_value
    

    ​ 全局启用:settings.py

    REST_FRAMEWORK = {
     # 认证模块
     'DEFAULT_AUTHENTICATION_CLASSES': (
     'user.authentications.JSONWebTokenAuthentication',
     ),
    }
    

    ​ 局部禁用启用:任何一个cbv类首行

    # 局部禁用
    authentication_classes = []
    
    # 局部启用
    from user.authentications import JSONWebTokenAuthentication
    authentication_classes = [JSONWebTokenAuthentication]
    

    ​ 多方式登录:utils.py

    import re
    from .models import User
    from djaogo.contrib.auth.backends importsModelBackend
    class JWTModelBackend(ModelBackend):
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                if re.match(r'^1[3-9]d{9}$', username):
                    username = User.objects.get(mobile=username)
                else:
                    username = User.objects.get(username=username)
            except User.DoesNotExist:
                return None
            if user.check_password(password) and self.user_can_autnenticate(user):
                return user
    

    ​ 配置多方式登录:settings.py

    AUTHENTICATION_BACKENDS = ['user.utils.JWTModelBackend']
    

    ​ 手动签发jwt:

    from rest_framework_jwt.settings import api_settings
    
    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)
    

    五、总结

    ​ 1、jwt认证:三段式的格式、每一段的内容、由后台签发到前台存储再到传给后台校验的认证流水线

    ​ 2、drf-jwt插件:
    ​ 三个接口:签发token、校验token、刷新token
    ​ 自定义jwt插件的配置

    ​ 3、使用jwt插件完成多方式登录
    ​ 视图类:将请求数据交给序列化类完成校验,然后返回用户信息和token(从序列化对象中拿到)
    ​ 序列化类:自定义反序列化字段,全局钩子校验数据得到user和token,并保存在序列化类对象中
    ​ token可以用jwt插件的rest_framework_jwt.serializers中
    ​ jwt_payload_handler,jwt_encode_handler
    ​ 完成签发

    ​ 4、自定义频率类完成视图类的频率限制
    ​ 1)定义类继承SimpleRateThrottle,重写get_cache_key方法,设置scope类属性
    ​ 2)scope就是一个认证字符串,在配置文件中配置scope字符串对应的频率设置
    ​ 3)get_cache_key的返回值是字符串,该字符串是缓存访问次数的缓存key

  • 相关阅读:
    1-29反射
    1-28Map简介
    1-27TreeSet简介
    1-26HashSet简介
    1-25泛型
    1-24List三个子类的特点
    1-23集合概述
    Java接口
    1-22日期类型
    简易计算器的实现
  • 原文地址:https://www.cnblogs.com/tangceng/p/11938743.html
Copyright © 2020-2023  润新知