📅  最后修改于: 2023-12-03 15:07:41.480000             🧑  作者: Mango
JWT 是一种广泛使用的令牌格式,用于在网络应用程序之间传递身份验证和授权信息。JWT 令牌包含一个有效载荷,该有效载荷包含有关用户的信息,例如姓名、电子邮件、角色等。然而,如果 JWT 令牌过期,有效载荷将不再可用。在这种情况下,我们需要提取已过期的令牌的有效负载以查看用户信息。在本文中,我将介绍如何从已过期的 JWT 令牌中提取有效载荷。
在了解如何提取有效载荷之前,请先了解 JWT 令牌的结构。JWT 令牌由三个部分组成,它们由点分隔符分隔:
JWT 令牌结构示例如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
在本例中,令牌的头部是 Base64 编码的字符串,它指出了签名算法类型和令牌类型。有效负载也是 Base64 编码的字符串,包含有关用户的信息,例如用户 ID 和角色。签名是对头部和有效负载的哈希值,用于保护令牌的完整性。通过验证签名,可以确保令牌没有被篡改。
下面是一个步骤,您可以在 JavaScript 中使用来提取过期的 JWT 令牌的有效负载。
在 JavaScript 中,我们可以使用 split()
函数将令牌分解为其组成部分。我们将使用点分隔符将令牌分解为三个部分:
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
const [header, payload, signature] = token.split(".");
此代码为我们提供了一个头部、有效负载和签名变量,包含 JWT 令牌中的相应部分。
由于有效负载是 Base64 编码的字符串,我们需要将其解码为 JSON 对象。我们将使用 atob()
函数解码:
const decodedPayload = JSON.parse(atob(payload));
JWT 令牌有一个特殊的属性 exp
,用于记录有效载荷的到期时间。我们需要从解码后的有效负载对象中提取该属性,以便知道令牌何时到期。
const expiresAt = decodedPayload.exp;
最后,我们检查过期时间是否已经过期,判断是否提取过期JWT 令牌的有效载荷。我们将使用 Date.now()
函数获取当前时间戳,并将其与到期时间进行比较。
if (Date.now() / 1000 >= expiresAt) {
// Token is expired, extract payload
const expiredPayload = decodedPayload;
// ...
}
如果Date.now() / 1000 >= expiresAt
,则收到的令牌已经过期,我们可以提取有效负载。
这就是从过期 JWT 令牌中提取有效负载的方法,只需要分解令牌,解码有效负载,提取到期时间并检查有效性。为了避免忘记在应用程序中检查过期时间,建议使用现成的 JWT 库,例如 jsonwebtoken
,它可以HMAC签名和验证JWT令牌,还支持自动验证令牌,以便提取有效载荷信息。