zoukankan      html  css  js  c++  java
  • Django中的Cookie、Session、Token

    Cookie指望着为了辨别用户身份、进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发送该Cookie给服务器

    Django中写cookie:  response.set_cookie(键,值,max_age=秒), 默认浏览器关闭过期
        
    Django读cookie:  request.COOKIE.get(键) 

    Session:客户端在服务器上的身份标识,是一种无状态的持久机制,需要存储空间的,session是依赖于Cookie存在的,以鉴值对的格式保存在服务器上,内容会被加密

    保存方式: 

     1.关系型数据库

     2.缓存———》本地内存,常用的有redis

    在Django中操作session,保存在redis中的简单步骤
            1.配置setting.py
            2.写:request.session[键]=3.读:request.session.get(键)

    sesion的保存和获取流程图

    第一步: 浏览器访问A网站====>1.服务器端首次写入session,如session["name"] = "AAA"
                                                       2.服务器端生成唯一标识符(随机字符串)
                                                       3.服务器端向redis中保存=====>格式:键值对
                                                                       键:唯一标识符
                                                                       值:加密的字典:{"name":"AAA"} # 在redis中保存的键值对并不是name:AAA
            
                                                       4.服务器端将唯一标识符保存到cookie中===>格式:键值对
                                                                                                    键:session_id
                                                                                                    值:唯一标识符(如图所示)
                                                                                
                                                       5.到此就能保存每个用户的浏览器保存的session信息都不一样
                                    
    第二步:  浏览器保存服务器返回的cookie信息
            
    第三步:  当用户再次访问该网站时,浏览器自动携带所有相关的cookie信息(包括session_id)
                ====>1.服务器读取cookie,从中获取到session_id
                           2.根据session_id获取对应的唯一标识符
                           3.通过唯一标识符,作为键 ,去redis中获取对应的值(加密的字典{"name":"ywk"})
                           4.解密字典,获取session真正的信息

    JWT : 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制

    为什么使用JWT:

    由于Http协议是一种无状态的协议,若用户向我们的应用提供了用户名和密码进行用户认证,那下一次请求时,用户需要再一次进行用户认证,因为http协议,并不能知道是哪个用户发出的请求,为了让应用能识别是哪个用户发出的请求,只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时用户访问应用时能识别请求来自哪个用户,这就是为什么使用session认证

    但是由于不同客户端的增加,独立的服务器会无法承载更多的用户,使用session会暴露更多的问题,例如

    扩展性:用户认证之后,服务端做认证记录,记录会保存在内存中,用户下次请求时就必须在这台服务器上才能拿到授权的资源,这样在分布式的应用上,限制了负载均衡器的能力,也限制了应用的扩展能力

    CSRF:跨域请求伪造,截获浏览器上的cookie,发送恶意请求

    这时候就需要使用token的鉴权机制了

    Token:服务端生成的一串字符串,有唯一标识。是用户第一次登陆后,服务器生成一个token并将此token返回给客户端,以后客户端再次请求数据时只需要带上这个token,不需要再次带上用户名和密码

    流程:

      1.用户使用用户名和密码请求服务器

      2.服务器进行验证用户的信息

      3.服务器通过验证发送给用户一个token  

      4.客户端存储token,并在每次请求是附送这个token值  

      5.服务端验证token,并返回数据

    JWT的构成头部(headler)载荷(payload)签证(signature),头部是使用 HMAC SHA256的算法加密,剩下2个是使用base64的算法加密

    JWT的使用:在Django中使用Django REST framework JWT扩展来完成。

          文档网站:http://getblimp.github.io/django-rest-framework-jwt/

    使用步骤:

    1. 安装:

    pip install djangorestframework-jwt

    2. 配置:

    # 身份认证的方式:JWT session
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 前后端分离使用jwt验证
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        # 访问admin后台使用session
        'rest_framework.authentication.SessionAuthentication',
    ),
    }
      
    # 过期时间为10小时
    JWT_AUTH = {
      # timedelta 时间差
        'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=10),
      }
    • JWT_EXPIRATION_DELTA 指明token的有效期

    3. 使用

    在创建user对象的时候手动生成token

    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)

    4. 在序列化中定义增加字段token

    from rest_framework_jwt.settings import api_settings
    
    # 创建用户序列化器 class CreateUserSerializer(serializers.Serializer): ... # token字段 token = serializers.CharField(label='登录状态token', read_only=True) ... def create(self, validated_data): """ 创建用户 """ user=User() ... 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) user.token = token return user
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10529413.html
Copyright © 2011-2022 走看看