使用 JWT 进行身份验证

本文由 chatgpt 生成,可能存在错误。

JWT(JSON Web Token)详解

JWT(JSON Web Token)是一种用于在网络应用环境间安全地传递信息的开放标准(RFC 7519)。它通过数字签名的方式来确保信息的完整性和真实性。JWT 主要由三部分组成:

  1. Header(头部):通常包含令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
  2. Payload(有效载荷):包含声明(claims),即需要传递的信息。有效载荷可以包含用户身份和一些元数据。
  3. Signature(签名):通过将编码后的头部、有效载荷和一个密钥(secret)组合成的结果,以确保信息未被篡改。

JWT 的结构如下:

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 的使用场景

  • 身份验证:用户登录后,后端生成 JWT 并返回给客户端,客户端在后续请求中携带该令牌,后端可以通过验证 JWT 来确认用户身份。
  • 信息交换:JWT 可以安全地传递信息,因其可以被签名(例如,使用公钥/私钥对)。

PHP 后端示例

下面是一个使用 PHP 创建和验证 JWT 的示例。

Composer 安装依赖

首先,安装 firebase/php-jwt 库:

1
composer require firebase/php-jwt

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
<?php
require 'vendor/autoload.php';

use \Firebase\JWT\JWT;

$key = "your_secret_key"; // 密钥
$payload = [
"iss" => "http://yourdomain.com", // 签发者
"aud" => "http://yourdomain.com", // 受众
"iat" => time(), // 签发时间
"exp" => time() + 3600, // 过期时间
"data" => [
"id" => 123,
"name" => "John Doe"
]
];

// 生成 JWT
$jwt = JWT::encode($payload, $key);
echo "生成的 JWT: " . $jwt . "\n";

// 验证 JWT
try {
$decoded = JWT::decode($jwt, $key, ['HS256']);
print_r($decoded);
} catch (Exception $e) {
echo "验证失败: " . $e->getMessage();
}
?>

Node.js 后端示例

在 Node.js 中,我们可以使用 jsonwebtoken 库来处理 JWT。

安装依赖

1
npm install jsonwebtoken

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
const jwt = require("jsonwebtoken");

const secretKey = "your_secret_key"; // 密钥

// 生成 JWT
const payload = {
iss: "http://yourdomain.com", // 签发者
aud: "http://yourdomain.com", // 受众
iat: Math.floor(Date.now() / 1000), // 签发时间
exp: Math.floor(Date.now() / 1000) + 3600, // 过期时间
data: {
id: 123,
name: "John Doe",
},
};

const token = jwt.sign(payload, secretKey);
console.log("生成的 JWT:", token);

// 验证 JWT
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
console.log("验证失败:", err.message);
} else {
console.log("验证成功:", decoded);
}
});