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
  • 相关阅读:
    pycharm上传代码到github中
    requests的封装(user-agent,proxies)
    Flask
    CTBCMCLibUser类
    TB timer 的用法
    多个 additional include directories 的复制方法
    怎样在编译时不显示警告
    infragistics 循环每一个选中的行
    Infragitics ultra grid 实现点击某一个cell的时候选中整行,并且不可编辑
    c#转换 datetime
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10529413.html
Copyright © 2011-2022 走看看