Flask中的JWT

Flask中的JWT

  1. JWT认证
    Json Web Token(JWT)

    JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。

    JWT是一个有着简单的统一表达形式的字符串:
    Flask中的JWT_第1张图片

    头部(Header)

    头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。

    载荷(PayLoad)

    payload的五个字段都是由JWT的标准所定义的。

    1. iss: 该JWT的签发者
    2. sub: 该JWT所面向的用户
    3. aud: 接收该JWT的一方
    4. exp(expires): 什么时候过期,这里是一个Unix时间戳
    5. iat(issued at): 在什么时候签发的

    后面的信息可以按需补充,JSON内容要经Base64 编码生成字符串成为PayLoad。

    签名(signature)

    这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。

  2. 为什么使用JWT?
    解析: jwt (JSON WEB TOKEN) 是一个JSON格式的规范
    之前学过的认证方案: session的认证方案
    特点: 非常轻巧
    使用jwt替代session的原因:
    	session是基于cookie的,所以在android和ios中,并不通用。为了统一前端认证方案,使用jwt。
    备注:
    	我们一般说的jwt指的是jws。
    
  3. JWT的通讯流程

    Flask中的JWT_第2张图片

  4. JWS
    jws是一个jwt的一种实现方式。
    数据格式:
    	header.payload.signature
    	1.header(头部):头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。
    	2.payload(载荷): 可以简单的理解为我们自己要传输的数据
    	3.signature(签名)
    备注:
    	1.JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。
    	2.但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。
    
  5. JWE
    jwe是一个jwt的另外一种实现方式。
    备注:
    	JWE的计算过程相对繁琐,不够轻量级,因此适合与数据传输而非token认证,但该协议也足够安全可靠,用简短字符串描述了传输内容,兼顾数据的安全性与完整性。	
    	我们平时说的jwt一般还是指的是jws.
    
  6. JWT刷新

    Flask中的JWT_第3张图片

  7. pyjwt

    • 生成token

      import jwt
      token = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
      # 有时效的token
      token = jwt.encode({'some': 'payload','exp':有效期的截止时间的时间戳}, 'secret', algorithm='HS256')
      
    • 验证token

      import jwt
      jwt.decode(token, "secret")
      
      # 如果验证失败,抛出异常jwt.PyJWTError
      # 如果token中的payload中包含了exp字段,decode方法会同时检验是否过期
      
  8. 示例
    import jwt
    from flask import current_app
    
    def generate_jwt(payload, expiry, secret=None):
        """
        生成jwt
        :param payload: dict 载荷
        :param expiry: datetime 有效期
        :param secret: 密钥
        :return: jwt
        """
        _payload = {'exp': expiry}
        _payload.update(payload)
    
        if not secret:
            secret = current_app.config['JWT_SECRET']
    
        token = jwt.encode(_payload, secret, algorithm='HS256')
        return token.decode()
    
    def verify_jwt(token, secret=None):
        """
        检验jwt
        :param token: jwt
        :param secret: 密钥
        :return: dict: payload
        """
        if not secret:
            secret = current_app.config['JWT_SECRET']
    
        try:
            payload = jwt.decode(token, secret, algorithm=['HS256'])
        except jwt.PyJWTError:
            payload = None
    
        return payload
    
  9. JWT安全防护的机制

Flask中的JWT_第4张图片

你可能感兴趣的:(Flask框架,Flask中JWT,JWT安全防护机制)