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);