首页
学习
活动
专区
圈层
工具
发布

使用JWT身份验证调用PHP API

使用 ​​JWT(JSON Web Token)​​ 进行身份验证调用 ​​PHP API​​ 的过程通常包括以下步骤:

  1. ​客户端生成 JWT​​(或从登录接口获取 JWT)。
  2. ​客户端在请求头中携带 JWT​​(通常放在 Authorization: Bearer <token>)。
  3. ​PHP API 验证 JWT​​(检查签名、过期时间等)。
  4. ​如果 JWT 有效,API 处理请求并返回数据​​。

​1. 客户端生成 JWT(或从登录接口获取)​

JWT 通常由 ​​登录接口​​ 返回,客户端存储(如 localStorageCookie),并在后续请求中携带。

​示例:客户端登录获取 JWT(假设 API 提供登录接口)​

代码语言:javascript
复制
// 假设使用 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
});

​2. 客户端在请求头中携带 JWT​

在后续 API 请求中,客户端需要在 Authorization 头中携带 JWT:

代码语言:javascript
复制
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);
});

​3. PHP API 验证 JWT​

PHP 使用 ​firebase/php-jwt​ 库(推荐)或手动解析 JWT。

​(1) 安装 firebase/php-jwt

代码语言:javascript
复制
composer require firebase/php-jwt

​(2) PHP API 验证 JWT(示例 protected.php)​

代码语言:javascript
复制
<?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()]);
}

​4. PHP 登录接口生成 JWT(示例 login.php)​

代码语言:javascript
复制
<?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']);
}
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券