• Python3 JWT的生成与验证


    使用的三方库为pyjwt,可以通过以下命令安装

    $ pip isntall pyjwt
    

    jwt可以分为encode编码和decode解码:

    • jwt.encode(): 配合密钥将字典格式的数据,编码成字符串,即token
    • jwt.decode(): 配合密钥将字符串token还原成字典个数数据

    一般来说,这个字典格式的数据中还要包含一个'exp': 'token过期时间戳',用于验证token是否过期,例如:

    import time
    import jwt # 需要安装pyjwt  pip isntall pyjwt
    
    secret_key = 'secret'  # 密钥
    
    # 生成token
    data = {'a': 1, 'b': 2}
    data['exp'] = int(time.time()) + 60 *5  # 过期时间设置为 当前时间加5分钟
    
    token = jwt.encode(data, secret_key, algorithm='HS256')
    
    # 验证token
    
    data1 =  jwt.encode(token, secret_key, algorithms=['HS256'])  # 注意解码时,算法参数为algorithms,多一个s
    # 如果token不合法,解码时会抛出jwt.PyJWTError异常
    exp = data1.pop('exp') # 得到超时时间
    assert exp >= time.time()  # 验证未过期
    assert data1 == data  # 验证还原的数据与原数据相同
    

    参考封装如下:

    import time
    
    import jwt  
    
    
    JWT_TOKEN_EXPIRE_TIME = 3600 * 2  # token有效时间 2小时
    JWT_SECRET = 'abc'   # 加解密密钥
    JWT_ALGORITHM = 'HS256'  # 加解密算法
    
    
    def generate_jwt_token(user_id: int)->str:
        """根据用户id生成token"""
        payload = {'user_id': user_id, 'exp': int(time.time()) + JWT_TOKEN_EXPIRE_TIME}
        token = jwt.encode(payload, JWT_SECRET, algorithm=JWT_ALGORITHM)
        return token
        
        
    def verify_jwt_token(user_id: int, token: str)->bool:
        """验证用户token"""
        payload = {'user_id': user_id}
        try:
            _payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
        except jwt.PyJWTError:
            print('token解析失败')
            return False
        else:
            print(_payload)
            exp = int(_payload.pop('exp'))
            if time.time() > exp:
                print('已失效')
                return False
            return payload == _payload
    
    
    if __name__ == '__main__':
        user_id = 123
        token = generate_jwt_token(user_id)
        print(verify_jwt_token(user_id, token))
    

    实际在使用中JWT Token一般放于请求头Authorization中,例如:

    GET https://...   HTTP/1.1
    ...
    Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTY1Mjk0MDUxOX0.3N5AhXCBumF4CbGwWRUioOzYLWvnpIuhLI2LpDFF5M0
    ...
    
  • 相关阅读:
    Hive 窗口函数LEAD LAG FIRST_VALUE LAST_VALUE
    xargs命令
    left semi join VS left join
    静态类静态属性静态方法
    DATASET()用法
    更改数据,ExecuteNonQuery()
    SqlDataReader
    数据适配器
    数据库连接-引用配置文件
    sql获取当前时间
  • 原文地址:https://www.cnblogs.com/superhin/p/16288059.html
Copyright © 2020-2023  润新知