当前位置:首页 > 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 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERV…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO que…

php实现https

php实现https

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

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL…

php 实现https

php 实现https

在 PHP 中实现 HTTPS 确保 PHP 应用通过 HTTPS 协议安全传输数据,可以通过以下几种方式实现: 配置服务器强制 HTTPS 在 Web 服务器(如 Apache 或 Nginx)…