当前位置:首页 > 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 的示例:

jwt php 实现

<?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 常用于用户认证。以下是一个简单的登录接口示例:

jwt php 实现

<?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 的 payload 中,因为 JWT 可以被解码(尽管不能被篡改)。

标签: jwtphp
分享给朋友:

相关文章

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…