天天看点

JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】

JWT

Json Web Token(JWT)

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

官方定义:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】

JWT是一个有着简单的统一表达形式的字符串:

JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】
头部(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对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。

JWT的Python库

独立的JWT Python库

  • itsdangerous
    • JSONWebSignatureSerializer
    • TimedJSONWebSignatureSerializer (可设置有效期)
  • pyjwt

    https://pyjwt.readthedocs.io/en/latest/

安装

  • $ pip install pyjwt
               

用例

  • >>> import jwt
    
      >>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
      >>> encoded_jwt
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'
    
      >>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
      {'some': 'payload'}           

 示例代码:产生与校验

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           

多思考也是一种努力,做出正确的分析和选择,因为我们的时间和精力都有限,所以把时间花在更有价值的地方。