Python JWT

17 Mar 2025 | 4 分钟阅读

Python JWTJSON Web Token (JWT) 是一种简洁、URL 安全的机制,用于表示需要在两个方之间(JWT)交换的声明。它经常用于在计算机之间传输数据和安全地验证用户。在本教程中,我们将介绍 JWT 的基础知识以及如何在 Python 中使用它们。JWT 标准定义了一种清晰全面的方法,可以安全地在各方之间交换数据。这些信息可以被验证和信任,因为它们经过数字签名。例如,当用户登录网站时,JWT 经常用于验证用户身份并将信息安全地在系统之间传输。

JWT 由三个部分组成,用点 (.) 分隔,分别是头部 (header)、载荷 (payload) 和签名 (signature)。头部包含两个关键部分:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。载荷包含声明。声明包括有关实体(通常是用户)的补充元数据和声明。注册声明、公共声明和私有声明是三种不同的声明类别。为了提供一套可用且可互操作的声明,鼓励使用一组预定义的声明(称为注册声明),但不强制要求。iss(签发者)、exp(过期时间)、sub(主题)、aud(受众)等是注册声明的示例。JWT 的签名用于确认发送者是其声称的身份,并保证消息在传输过程中未被篡改。

为了在 Python 中使用 JWT,我们需要安装一个支持它的库。Python 中有几个用于编码和解码 JWT 的库,包括 PyJWT、Jose 和 python_jose。在本文中,我们将以 PyJWT 为例。

首先,我们需要使用 pip 安装 PyJWT 库

安装完库后,我们就可以开始使用它来编码和解码 JWT 了。我们先从编码 JWT 开始。

输出

Python JWT

说明

在此示例中,我们首先定义了 JWT 的头部和载荷。头部包含签名算法 (HS256) 和令牌类型 (JWT)。载荷包含声明,例如主题 (sub)、姓名和签发时间 (iat)。我们还定义了一个密钥 (Ravipass),将用于签名令牌。然后,我们使用 PyJWT 库中的 encode 函数,使用密钥和算法对载荷和头部进行编码。该函数返回编码后的 JWT 作为字节字符串,可以将其发送到客户端或服务器。

现在我们已经编码了 JWT,让我们对其进行解码以验证声明。

输出

Python JWT

说明

此代码演示了如何使用 PyJWT 库编码和解码 JSON Web Token (JWT)。“header”变量是一个字典,包含“alg”(算法)和“typ”(类型)字段,分别设置为“HS256”和“JWT”。“payload”变量是一个字典,包含有关 JWT 的主题、姓名和签发时间的信息。“secret”变量是一个用作 JWT 编码和解码密钥的字符串。

JWT 使用 jwt.encode() 函数进行编码,该函数将载荷、密钥和算法作为参数。然后将编码后的 JWT 打印到控制台。

JWT 使用 jwt.decode() 函数进行解码,该函数将编码后的 JWT 和密钥作为参数。然后将解码后的 JWT 打印到控制台,这将得到我们最初编码的载荷。

在信任声明之前,验证 JWT 的签名也很重要。这可以通过在解码 JWT 时将 verify 参数设置为 True 来实现。

输出

Python JWT

说明

在此示例中,如果签名无效,decode 函数将引发 InvalidSignatureError,我们可以通过 try-except 块来处理它。

总而言之,JWT 是在各方之间安全传输信息的一种强大标准。借助 PyJWT 等库,可以在 Python 中轻松实现。重要的是要牢记安全最佳实践,例如包含过期时间并在信任声明之前验证令牌的签名和过期时间。


下一个主题Python 学习路径