📜  decode jwt - TypeScript (1)

📅  最后修改于: 2023-12-03 15:30:25.136000             🧑  作者: Mango

如何解码 JWT(TypeScript)

什么是 JWT?

JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用中传递信息。JWT被设计为紧凑的,易于在HTTP和HTML环境中传递。JWT的主要作用是在用户和服务器之间传递身份信息并进行认证。

JWT的结构

JWT由三个部分组成:

  • Header(头部):包含有关算法和令牌类型的元数据。
  • Payload(负载):包含有关用户信息和其他信息的数据。
  • Signature(签名):用于验证令牌的完整性。

下面是一个JWT的示例,由以上三个部分组成:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwib3JpZ2luIjoidGVzdCJ9.C5D_yabg78cIxF_9MKc9-SdF3L1zVcpZKag4nWiY84o
Header

Header是一个JSON对象,通常包含两个字段:“alg”表示签名的算法,例如:HS256、RS256等;“typ”表示JWT的类型,通常为“JWT”。

示例Header:

{
  "alg": "HS256",
  "typ": "JWT"
}
Payload

Payload是一个JSON对象,可以包含多个声明(claim),每个声明代表一个实体(通常是用户)和其他数据。有三种声明类型:

  • Registered(注册声明):由JWT标准规范定义,包括:iss(issuer)、sub(subject)、aud(audience)、exp(expiration time)、nbf(not before)和iat(issued at)。
  • Public(公共声明):由开发人员定义,用于在JWT交换信息,但不强制执行。
  • Private(私有声明):由开发人员定义,用于在JWT交换信息,但只在双方之间共享。

例如,以下负载包含了用户的名称和个人资料:

{
  "username": "admin",
  "profile": "test"
}
Signature

签名用于验证令牌的完整性。签名由编码后的Header和Payload,以及秘钥进行Hash生成的。

如何解码JWT

在Node.js中,我们可以使用jsonwebtoken来编码/解码JWT。以下是解码的步骤:

  1. 引入jsonwebtoken库
import jwt from 'jsonwebtoken';
  1. 调用jwt.verify()方法来验证JWT并解码Payload
const secret = 'your_secret_key_here';
const jwtToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwib3JpZ2luIjoidGVzdCJ9.C5D_yabg78cIxF_9MKc9-SdF3L1zVcpZKag4nWiY84o';

try {
  const decodedToken = jwt.verify(jwtToken, secret);
  console.log(decodedToken);
} catch (err) {
  console.error(err);
}
  1. decodedToken包含解码后的Payload

输出结果:

{
  "username": "admin",
  "origin": "test",
  "iat": 1640495990
}

如上所示,我们可以很容易地解码JWT并获取负载中的信息。

以上是在Node.js中解码JWT的方法,其他语言和平台可能会有所不同,但基本思路都是相似的。