当前位置:首页 > PHP

jwt php 实现

2026-02-14 22:28:50PHP

JWT 在 PHP 中的实现

安装依赖库

使用 Composer 安装 firebase/php-jwt 库,这是一个流行的 JWT 实现库:

composer require firebase/php-jwt

生成 JWT Token

以下代码展示了如何生成一个 JWT Token:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

$key = "your_secret_key"; // 替换为你的密钥
$payload = array(
    "iss" => "http://example.org", // 签发者
    "aud" => "http://example.com", // 接收方
    "iat" => time(), // 签发时间
    "exp" => time() + 3600, // 过期时间(1小时后)
    "data" => array( // 自定义数据
        "user_id" => 123,
        "username" => "john_doe"
    )
);

$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>

验证 JWT Token

以下代码展示了如何验证和解码 JWT Token:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

$key = "your_secret_key"; // 替换为你的密钥
$jwt = "your_jwt_token"; // 替换为需要验证的 JWT Token

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

自定义算法

firebase/php-jwt 支持多种算法,如 HS256RS256 等。以下是使用 RS256 的示例:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

// 生成 RSA 密钥对
$privateKey = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
...你的私钥内容...
-----END RSA PRIVATE KEY-----
EOD;

$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
...你的公钥内容...
-----END PUBLIC KEY-----
EOD;

$payload = array(
    "iss" => "http://example.org",
    "iat" => time(),
    "exp" => time() + 3600,
    "data" => array(
        "user_id" => 123
    )
);

// 使用 RS256 算法生成 Token
$jwt = JWT::encode($payload, $privateKey, 'RS256');
echo $jwt;

// 验证 Token
try {
    $decoded = JWT::decode($jwt, $publicKey, array('RS256'));
    print_r($decoded);
} catch (Exception $e) {
    echo '验证失败: ',  $e->getMessage(), "\n";
}
?>

错误处理

在实际应用中,需要妥善处理可能的异常情况,如 Token 过期、签名无效等:

try {
    $decoded = JWT::decode($jwt, $key, array('HS256'));
    // 业务逻辑处理
} catch (\Firebase\JWT\ExpiredException $e) {
    echo 'Token 已过期';
} catch (\Firebase\JWT\SignatureInvalidException $e) {
    echo '签名验证失败';
} catch (Exception $e) {
    echo '其他错误: ' . $e->getMessage();
}

实际应用场景

在实际应用中,JWT 常用于用户认证。以下是一个简单的登录接口示例:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

// 假设用户通过表单提交了用户名和密码
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

// 验证用户凭据(这里简化处理)
if ($username === 'admin' && $password === 'password') {
    $key = "your_secret_key";
    $payload = array(
        "iss" => "your_issuer",
        "iat" => time(),
        "exp" => time() + 3600,
        "user_id" => 1,
        "username" => $username
    );

    $jwt = JWT::encode($payload, $key, 'HS256');
    echo json_encode(array("token" => $jwt));
} else {
    http_response_code(401);
    echo json_encode(array("error" => "无效的凭据"));
}
?>

注意事项

密钥需要妥善保管,不应硬编码在代码中或提交到版本控制系统。可以考虑使用环境变量或专门的密钥管理服务。

对于生产环境,建议使用非对称加密算法(如 RS256)而非对称加密算法(如 HS256),以提供更好的安全性。

Token 的过期时间应根据实际需求设置,不宜过长也不宜过短。常见设置为 1-24 小时。

jwt php 实现

敏感数据不应存储在 JWT 的 payload 中,因为 JWT 可以被解码(尽管不能被篡改)。

标签: jwtphp
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…