使用 JWT(JSON Web Token) 进行身份验证调用 PHP API 的过程通常包括以下步骤:
Authorization: Bearer <token>
)。JWT 通常由 登录接口 返回,客户端存储(如 localStorage
或 Cookie
),并在后续请求中携带。
// 假设使用 fetch API 调用 PHP 登录接口
fetch('https://example.com/api/login.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'user123',
password: 'pass123'
})
})
.then(response => response.json())
.then(data => {
const jwtToken = data.token; // 假设 API 返回 { "token": "jwt.token.here" }
localStorage.setItem('jwt', jwtToken); // 存储 JWT
});
在后续 API 请求中,客户端需要在 Authorization
头中携带 JWT:
const jwtToken = localStorage.getItem('jwt');
fetch('https://example.com/api/protected.php', {
method: 'GET',
headers: {
'Authorization': `Bearer ${jwtToken}`
}
})
.then(response => response.json())
.then(data => {
console.log(data);
});
PHP 使用 firebase/php-jwt
库(推荐)或手动解析 JWT。
firebase/php-jwt
composer require firebase/php-jwt
protected.php
)<?php
require 'vendor/autoload.php'; // 引入 Composer 自动加载
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
header('Content-Type: application/json');
// 1. 从请求头获取 JWT
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
$jwt = $matches[1];
} else {
http_response_code(401);
echo json_encode(['error' => 'Authorization header missing or invalid']);
exit;
}
// 2. JWT 密钥(必须与生成 JWT 时使用的密钥一致)
$secretKey = 'your-secret-key'; // 替换为你的密钥
try {
// 3. 解码并验证 JWT
$decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));
// 4. JWT 有效,可以访问用户数据(如 $decoded->sub, $decoded->iat 等)
$userId = $decoded->sub; // 假设 JWT 包含用户 ID
$userName = $decoded->name; // 假设 JWT 包含用户名
// 5. 返回受保护的数据
echo json_encode([
'message' => 'Access granted',
'user' => [
'id' => $userId,
'name' => $userName
]
]);
} catch (Exception $e) {
// JWT 无效(过期、签名错误等)
http_response_code(401);
echo json_encode(['error' => 'Invalid token: ' . $e->getMessage()]);
}
login.php
)<?php
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
header('Content-Type: application/json');
// 1. 模拟用户验证(实际应查询数据库)
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if ($username === 'user123' && $password === 'pass123') {
// 2. 用户验证成功,生成 JWT
$secretKey = 'your-secret-key'; // 必须与 API 验证使用的密钥一致
$payload = [
'sub' => 123, // 用户 ID
'name' => 'John Doe', // 用户名
'iat' => time(), // 签发时间
'exp' => time() + 3600 // 过期时间(1 小时后)
];
$jwt = JWT::encode($payload, $secretKey, 'HS256');
// 3. 返回 JWT 给客户端
echo json_encode(['token' => $jwt]);
} else {
http_response_code(401);
echo json_encode(['error' => 'Invalid credentials']);
}
没有搜到相关的文章