mybot/common/generate_jwt.py

43 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
pypi地址https://pypi.org/project/jwt/
# JWT 签名算法
JWT 最常见的几种签名算法(JWA)HS256(HMAC-SHA256) 、RS256(RSA-SHA256) 还有 ES256(ECDSA-SHA256)。
## HS256
HS256 使用同一个「secret_key」进行签名与验证对称加密。一旦 secret_key 泄漏,就毫无安全性可言了。
因此 HS256 只适合集中式认证,签名和验证都必须由可信方进行。
## RS256
RS256 是使用 RSA 私钥进行签名,使用 RSA 公钥进行验证。公钥
## ES256
ES256 和 RS256 一样,都使用私钥签名,公钥验证。算法速度上差距也不大,但是它的签名长度相对短很多(省流量),并且算法强度和 RS256 差不多。
"""
import jwt # 安装pip install jwt
from jwt import jwk_from_pem
from jwt.utils import get_int_from_datetime
from datetime import datetime, timezone, timedelta
def generate_jwt_token(bot, alg="RS256"):
"""
生成jwt_token
:param bot: bot的信息包括bot_id以及bot私钥保存的文件的绝对路径
:param alg: 算法类型
:return: 返回jwt_token
"""
try:
with open(bot.get("private_key"), "rb") as fh:
# 返回是一个jwt对象如下<jwt.jwk.RSAJWK object at 0x00000293FDA1FFA0>
signing_key = jwk_from_pem(fh.read())
payload = {
# Issued at time
'iat': get_int_from_datetime(datetime.now(timezone.utc)),
# JWT expiration time (10 minutes maximum)
'exp': get_int_from_datetime(datetime.now(timezone.utc) + timedelta(hours=1)),
'iss': bot.get('bot_id') # bot的id
}
jwt_instance = jwt.JWT()
return jwt_instance.encode(payload=payload, alg=alg, key=signing_key)
except Exception as e:
raise e