JWT概念
直观地来说,**JWT
** 是一段用于标识用户身份的 **字符串
**。
JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全地传输信息。它通常用于在用户身份验证后,在客户端和服务端之间安全地传递信息,以实现无状态的身份验证机制。
JWT格式
JWT 字符串由三部分组成,它们之间用英文句点(.)分隔,格式:”Header.Payload.Signature“。例子
1 2 3
| eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTc0NTEyNzEwOCwibmJmIjoxNzQ1MTI3MTA4LCJleHAiOjE3NDUyMTM1MDh9. vsptj95ICeZoP8zVtYiXRaDbiS31wuGmdsMdNcxwU-E
|
Header(头部) 包含令牌的类型(JWT
)和使用的签名算法(如 HMAC SHA256
或 RSA
)。
1 2 3 4
| { "alg": "HS256", "typ": "JWT" }
|
Payload(载荷) 包含声明(claims),即要传递的具体信息。
1 2 3 4
| { "username": "John Doe", "admin": true }
|
Signature(签名) 用于验证消息的发送者以及消息在传输过程中没有被修改。
Nodejs实现
生成JWT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| const crypto = require('crypto');
function sign(info, key) { const hmac = crypto.createHmac('sha256', key); hmac.update(info); return hmac.digest('hex'); }
function jwt(info, key) { const header = { alg: 'HS256', typ: 'JWT' }; const payload = { info: info, exp: Math.floor(Date.now() / 1000) + (60 * 60) }; const base64Header = Buffer.from(JSON.stringify(header)).toString('base64url'); const base64Payload = Buffer.from(JSON.stringify(payload)).toString('base64url'); const signature = sign(`${base64Header}.${base64Payload}`, key); return `${base64Header}.${base64Payload}.${signature}`; }
|
测试JWT
1 2 3 4 5
| const secret = 'mysecretkey'; const info = { username: 'admin' }; const token = jwt(info, secret); console.log('生成的JWT:', token);
|
解码JWT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
function verify(token, key) { const parts = token.split('.'); if (parts.length !== 3) { return false; } const [header, payload, signature] = parts; const validSignature = sign(`${header}.${payload}`, key); if (validSignature !== signature) { return false; } const decodedPayload = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8')); if (decodedPayload.exp < Math.floor(Date.now() / 1000)) { return false; } return decodedPayload.info; }
const verifiedInfo = verify(token, secret); console.log('验证后的信息:', verifiedInfo);
|