ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python3 JWT的生成与验证

2022-05-19 12:35:07  阅读:304  来源: 互联网

标签:验证 JWT jwt token user time id Python3


使用的三方库为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
...

标签:验证,JWT,jwt,token,user,time,id,Python3
来源: https://www.cnblogs.com/superhin/p/16288059.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有