2020.5.19 token生成

发布于 15 天前  7 次阅读


1.复习内容

2.灵感代办

3.学习内容

  • 面试

    • 离职原因:

      • 获客成本过高
      • 寻求技术突破
    • 前后端分离项目

      • 前端:客服端,负责渲染用户界面(android ios pc)
      • 后端:服务端,负责接收http请求,处理数据
      • API:application programming interface 预定义接口,用来通信
    • 前后端分离 完整请求过程

      • 1,前端通过http请求后端API
    • 2,后端以json形式返回前端数据
      • 3,前端生成用户显示界面【如html , ios , android】
    • 判断前后端分离的标准

    • 1.django或flash都不是使用render或者模板生成html
      • 2.后端只返回数据
    • 3.前端异步请求,接收json做页面渲染
    • 前后端分离的优点

    • 1.各司其职
      * 前端:视觉层面,兼容性(后端不好做兼容),性能优化(浏览器处理)

      • 后端:并发,可用性变高,性能更强
      • 2.解耦
      • 前端后端易于扩展
      • 3.通用性
      • 后端api可以让全平台使用
      • 4.前端后端并行开发
      • 5.提高用户体验
  • 前后端项目错误如何排查

  • 前后端项目分离常见问题

    • 如何解决http无状态问题

      • token
    • 安全问题,https能解决

      • 发给客户端token
      • 前端为JS,跨域怎么解决

        • jsoup
      • CORS

        ​ * 在头里面添加内容,协商来操作

      • csrf问题

        • token在登录后,cookie中就已经存在
      • SPA网站是否会影响SEO

        • 会影响SEO
        • Single Page web Application SPA
        • Search Engine Optimization SEO
    • token 令牌

      • JWT - json web token

      • JWT组成

        • 特征 一串字符串 有很多 “.”

        • 元数据格式
          • {‘alg’:’HS256’,’typ’:’JWT’}
        • alg 算法-默认为HS256
          • typ -默认JWT
        • payload

          • {‘exp’:xxx,’iss:’xxx}
            • 公共声明
              • exp:Expiration Time 过期时间 可选
              • nbf:(not Before Time) 生效时间 可选(不常用)
              • iss:issuer Claim 签发者 可选
              • aud:Audience Claim 签发面向群体(Android,IOS) 可选
              • iat:Issued At Claim 创建时间 可选
          • 私有声明
            • 用户可根据业务添加自己的表示
              • 放到payload字典里
          • 整体内容Base64加密
        • sign

          • 要加密的串
        • 注意事项

        • ```python
          import base64
          import copy
          import hmac
          import time
          import json

          """
          1.alg中是HS256
          2.hmac.new中digestmod = "SHA256“
          3.注意检测后hmac中的key为字节串
          4.exp的时间要在现有时间上做加法
          """
          class JWT:
          @staticmethod
          def encode(payload, key, exp=300):
          header_b = JWT.b64encode(json.dumps({'alg': "HS256", 'typ': "JWT"}, separators=(",", ":")).encode())
          # print(header_b)
          payload = copy.deepcopy(payload)
          payload['exp'] = time.time() + exp
          payload_b = JWT.b64encode(json.dumps(payload).encode())

            if isinstance(key, str):
                    key = key.encode()
            sign = hmac.new(key, header_b + b'.' + payload_b, digestmod="SHA256")
            sign_b = JWT.b64encode(sign.digest())
          
                # print(header_b + b'.' + payload_b + b'.' + sign_b)
                return header_b + b'.' + payload_b + b'.' + sign_b
          
            @staticmethod
            def decode(token, key):
                header, payload, sign = token.split(b".")
                now = time.time()
                # print(JWT.b64decode(payload))
            if isinstance(key, str):
                    key = key.encode()
                sign = JWT.b64decode(sign)
                new_sign = hmac.new(key, header + b'.' + payload, digestmod="SHA256").digest()
          
                if sign != new_sign:
                    raise ValueError("token error")
                exp = json.loads(JWT.b64decode(payload))['exp']
            # print(exp)
                if now > exp:
                    raise ValueError("时间错误")
                return json.loads(JWT.b64decode(payload))
          
            @staticmethod
          

          def b64decode(bs):
          bs += b"=" * (4 - len(bs) % 4)
          bs = base64.urlsafe_b64decode(bs)
          return bs

            @staticmethod
            def b64encode(b):
                return base64.urlsafe_b64encode(b).replace(b"=", b"")
          

          ```

          if name == "main":
          dicts = {"username": "wangjie"}
          a = JWT.encode(dicts, 'abcedf', 300)
          b = JWT.decode(a, 'abcedf')
          print(b)

          ```

      • Base64 防君子不防小人

        • Base64生成步骤

        • Base64记忆点

          • 二进制转换最常用的就是Base64
          • base64转换需要是字节串
          • Base64会比原来大小大30%左右
          • Base64一定能被4整除
          • 码表中是:A-za-Z0-9/+
          • / 一定要小心,在url中容易歧义,使用urlsafe_b64encode()
          • =号是不够补位使用的,常常需要去掉=号,decode在加上
          • urlsafe_b64encode()

          • 把=和/改成了 - 和 _
          import base64
          base64.b64encode(b'wangjie')
          
          # 注意是自己猜
          
          base64.b64decode(b'')
          base64.urlsafe_b64encode()
          
          
          #base64去掉等号
          
          base64.replace(b"=",b"")
          
          
          #base64增加等号
          
          base64 += b"="*(4-len(base64))
      • HS256 = HMAX-SHA256

        • 哈希算法:散列值 (三大特点 md5 sha)

        • # SHA256
          
          import hashlib
          s = hashlib.sha256()
          s.update(b'xxx')
          s.hexdigest()
          
          # md5已经被攻克
          
          
          # HMAC-SHA256
          
          import hmac
          h = hmac.new(key,str,digestmod="SHA256")
          h.hexdigest()
          
          # 4.RSA256 非对称加密
          
          两把钥匙 公钥 私钥
          1.加密:公钥加密 私钥解密
          2.签名:私钥签名,公钥验签

      • python DICT,SET实现

        • 哈希冲撞

          • 1.根据key A进行一次hash计算,hash
          • 2.计算数组中位置,比如计算索引为0
          • 3.继续存数据,遇到哈希碰撞
          • 4.以哈希碰撞的位置(比如都是索引0),继续哈希运算hash(‘0’+data),算出不冲突的索引
          • 5.删除字典时候,如果遇到哈希碰撞使用过的索引,则用伪删除,保留索引方便继续算出字典的值
        • 扩容字典

          • 一旦空间闲置位置少于3/1进行扩充
          • 所有元素都需要从新排列
        • 拿空间换时间,无序

    • 250919354@qq.com 郭君宇

4.扩展延伸知识

  • nginx和django直接

    • fastCGU
    • uWsgi
  • Python 中Json注意点

    • python字典转json
      • json.dumps(dicts, separators=(“,”,”:“))
      • 需要将空格去掉 separators=(“,”,”:”)
        • 参数1,多组keyvalue用什么分割
        • 参数2,key和value用什么分割
      • 需要排序,因为字典无序 sort_key=True

5.知识内容个人梳理

6.今天都复习了之前的什么内容


Ares个人进阶之路