📅  最后修改于: 2023-12-03 15:22:40.213000             🧑  作者: Mango
JSON Web Token(JWT)是由 RFC7519 规范定义的开放标准,用于在网络应用间传递声明。JWT 可以被用作身份认证和授权。
JWT 由三部分组成:Header、Payload 和 Signature,它们都使用 Base64 编码,并通过.连接起来。Header 指定了在 JWT 中使用的加密算法,比如 RS256,而 Payload 包含了声明信息。Signature 用于验证 JWT 的完整性。
在 Linux 环境下,我们可以使用 OpenSSL 程序来创建 RSA 私钥和公钥对,然后使用私钥对 JWT 进行签名,使用公钥进行验证。
使用以下命令生成一个 2048 位的 RSA 私钥文件:
openssl genrsa -out private.pem 2048
然后,使用下面的语句从私钥中提取公钥并保存到 public.pem 文件中:
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
安装 Python 的 PyJWT 库后,我们可以使用以下代码创建一个包含 claims(即声明信息)的 JWT:
import jwt
import datetime
payload = {
'sub': '1234567890',
'name': 'John Doe',
'iat': datetime.datetime.utcnow(),
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
private_key_path = 'private.pem'
with open(private_key_path, 'r') as f:
private_key = f.read()
token = jwt.encode(payload, private_key, algorithm='RS256')
其中,'sub' 表示主题(subject),'name' 表示名称,'iat' 表示 JWT 的签发时间,'exp' 表示 JWT 的过期时间。private_key_path 为 OpenSSL 生成的 RSA 私钥文件路径。
使用以下代码来验证 JWT:
import jwt
token = '<your JWT string>'
public_key_path = 'public.pem'
with open(public_key_path, 'r') as f:
public_key = f.read()
try:
payload = jwt.decode(token, public_key, algorithms=['RS256'])
print(payload)
except jwt.ExpiredSignatureError:
print('Token has expired')
except jwt.InvalidTokenError:
print('Token is invalid')
其中,token 为我们从其他应用获取的 JWT 字符串,public_key_path 为 OpenSSL 生成的 RSA 公钥文件路径。
如果 JWT 无效或已过期,将会抛出 jwt.InvalidTokenError 或 jwt.ExpiredSignatureError 异常。
以上就是在 Linux 环境下使用 RS256 算法创建和验证 JWT 的方法。在实际应用中,JWT 可以用于进行身份验证和授权,从而提高应用的安全性和可靠性。