您的位置:

JWT是什么?

JWT是指JSON Web Token,是一种基于JSON格式的用于进行身份认证的令牌。它可以将用户身份信息以JSON格式进行编码,并采用数字签名的方式保证其不被篡改。JWT可以通过在HTTP请求头中传递它来实现跨域身份认证,从而实现无状态分布式认证。

一、JWT的组成部分

JWT由三部分组成:Header、Payload和Signature。

1、Header

Header是一个JSON对象,包含两个字段,分别是

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

其中typ表示token的类型,固定为JWT;alg表示token签名的算法。HS256表示HMAC-SHA256。

2、Payload

Payload是真正的用户信息,在编码时需要遵循一定规范,一般包含以下字段:

{
  "sub": "123",         // 主题,一般指用户ID
  "name": "user",       // 用户名
  "iat": 1626938727,    // token签发时间
  "exp": 1627101527,    // token过期时间
  "iss": "www.example.com", // token签发者
  "aud": "www.example.com"  // token接收者
}

3、Signature

Signature用于保证token不被篡改。它由Header和Payload以及秘钥进行数字签名生成。生成方法如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), secret)

其中,HMACSHA256表示采用HMAC-SHA256算法进行签名;secret为秘钥。

二、使用JWT进行身份认证

使用JWT进行身份认证有以下几个步骤:

1、用户登录

用户使用用户名和密码登录系统,服务器检查用户信息是否正确,正确则生成一个JWT并返回给用户。

2、在请求头中携带JWT

用户在后续的HTTP请求中,需要在请求头中携带该JWT,格式如下:

Authorization: Bearer <JWT>

其中Authorization为请求头名称,Bearer是类型,<JWT>为实际JWT。

3、服务器验证JWT并解码

服务器需要从请求头中获取JWT并进行验证,验证需要使用到JWT的签名算法和秘钥,验证通过之后可以对JWT进行解码获取用户身份信息。

三、使用jsonwebtoken库进行JWT的生成和解码

jsonwebtoken库是使用Node.js进行JWT生成和解码的常用库之一。使用jsonwebtoken库可以快速、简便地实现JWT的生成和解码。

1、生成JWT

使用jsonwebtoken库生成JWT的示例代码如下:

const jwt = require('jsonwebtoken');

const token = jwt.sign({
  sub: '123',
  name: 'user',
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + (60 * 60),
  iss: 'www.example.com',
  aud: 'www.example.com'
}, 'secret');  // secret为秘钥

console.log(token);

2、解码JWT

使用jsonwebtoken库解码JWT的示例代码如下:

const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoidXNlciIsImlhdCI6MTYyNjkzODcyNywiZXhwIjoxNjI3MDExNTI3LCJpc3MiOiJ3d3cuZXhhbXBsZS5jb20iLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20ifQ.mnM_7X9bouqYuoWZ5d2UcVen3iHjf2k6-5N2KZtERvs';

const decoded = jwt.verify(token, 'secret');  // secret为秘钥

console.log(decoded);