jabarihunt/json-web-token

简单的 JSON Web Token 实现。

v1.0.0 2018-11-24 09:48 UTC

This package is auto-updated.

Last update: 2024-09-25 08:13:41 UTC


README

一个用于创建、签名和验证 JSON Web Tokens (JWT) 的简单且轻量级的类。该类还有一个创建超过所需长度两倍的安全密钥的方法。JWT 标准要求实现必须支持 HS256 和 "none" 作为有效算法(所有其他算法都是可选的)。此实现目前支持 HS256、HS384、HS512 和 "none"。未来版本将添加对 RS 和 ES 相似算法的支持。

入门

先决条件

在使用此类之前,如果您不熟悉 JWT,可能需要 复习 JWT。简而言之,JSON Web Tokens 被用作提供无状态身份验证或与受信任方交换可验证信息的自包含方法。

安装

通过 Composer

在您的 composer.json 文件相同目录下运行以下命令

php composer.phar require jabarihunt/json-web-token

通过 Github
  1. 将此存储库克隆到工作目录中: git clone git@github.com:jabarihunt/JSON-Web-Token.git .

  2. 在您的项目中包含 JWT 类...

require('/path/to/JWT.php')

...或者如果使用自动加载...

 use jabarihunt/JWT;

用法

选择算法

此类将默认使用 HS256 算法。如果您想使用其他算法之一,可以在 JWT::sign()JWT::generateSecret() 方法中可选地传递它。支持算法为类常量。为了举例,我们将设置一个算法变量以使用 HS384...

$algorithm = JWT::ALGORITHM_HS384;
创建密钥

您可以在使用 JWT::sign()JWT::verify() 方法时传递任何密钥。但是,为了创建一个非常安全的签名,您必须使用一个至少与加密位数相同的密钥。例如,如果您使用 HS256,则应使用至少 256 位(32 字节)的密钥。

注意:密钥应存储在安全位置(例如安全配置文件、.env 等),而不应在脚本中。此外,生成的密钥不是 URL 安全的,尽管如此,它也不应通过 HTTP 请求传递!

在我们的示例中,我们将生成一个密钥并传递上面创建的变量中的可选 $algorithm 参数...

$secret = JWT::generateSecret($algorithm);
var_dump($secret);
/* OUTPUT */
/var/www/html/controllers/HomeController.php:5:string 'e69KMtdewPimnO8zMwgwuVJUSgdbtMMFdib+Eo8TL/Jk2+NkONvZ9QYUm0U2sH93/qliaqMOGZz8vv0Y8Dh/SYWoTNRwniYg4M289GigKIQbDyBk3uNWGIGRtO7H1QkZ' (length=128)
创建 JSON Web Token

JSON Web Tokens 使用 JWT::sign() 方法创建,该方法接受 两个 必需参数和 一个 可选参数

(array) $payload - 包含要传输数据的数组。

(string) $secretOrPrivateKey - 对于 HS256、HS384 和 HS512 算法,它期望这是一个密钥(如上所述生成)。对于 "none" 算法,只需传递 NULL(它将忽略传递的任何值,因为不会附加签名)。对于所有其他算法,它期望一个字符串路径到用于加密签名的 私有 密钥文件。

(string) $algorithm (可选) - 要用于签名的算法名称(默认为 "HS256")。所有支持的算法都可以作为类常量访问。

结合上面的密钥(来自 $_ENV)和算法示例...

<?php

    $payload = ['iat' => time(), 'uid' => 357];
    $secret = $_ENV['JWT_SECRET'];
    $algorithm = JWT::ALGORITHM_HS384;

    $token = JWT::sign($payload, $secret, $algorithm);
    var_dump($token);
?>
/* OUTPUT: */
/var/www/html/controllers/HomeController.php:8:string 'eyJhbGciOiJIUzM4NCIsInR5cGUiOiJKV1QifQ.eyJpYXQiOjE1NDMwNDE0MjcsInVpZCI6MzU3fQ.ZjUzYzA5N2FhZGRlOGQ0Yzg2OWY0OWJiMmNmZGI3NjY3MTc4YWNhMTcyNzc3Y2ZlOGJkNzdlOWZhMTQxM2Y4NTE1ZjM4ZTBjY2RmOWY3MmQ2M2JhYjgxM2U3NmExOTM0' (length=206)
验证 JSON Web Token

使用 JWT::verify() 方法验证令牌,该方法期望 两个 参数

(字符串) $token - 一个标准的JSON Web Token。

(字符串) $secretOrPrivateKey - 对于HS256、HS384和HS512算法,它期望这是一个密钥(如上所述生成)。对于"none"算法,只需传递NULL它将忽略任何传递的值,因为不会附加签名)。对于所有其他算法,它期望一个指向匹配用于加密签名的私钥的公钥文件的字符串路径。

使用上面生成的token

<?php

    $token = 'eyJhbGciOiJIUzM4NCIsInR5cGUiOiJKV1QifQ.eyJpYXQiOjE1NDMwNDE0MjcsInVpZCI6MzU3fQ.ZjUzYzA5N2FhZGRlOGQ0Yzg2OWY0OWJiMmNmZGI3NjY3MTc4YWNhMTcyNzc3Y2ZlOGJkNzdlOWZhMTQxM2Y4NTE1ZjM4ZTBjY2RmOWY3MmQ2M2JhYjgxM2U3NmExOTM0';
    $secret = $_ENV['JWT_SECRET'];
    
    var_dump(JWT::verify($token, $secret));
    
?>

JWT::verify()方法将返回一个包含以下键的数组

(布尔值) isVerified - 如果token的签名有效,则为TRUE,否则为FALSE务必检查此内容!!!

(数组) header - token的解码头。

(数组) payload - token的解码负载。

/* OUTPUT: */
/var/www/html/controllers/HomeController.php:6:
array (size=3)
  'isVerified' => boolean true
  'header' => 
    array (size=2)
      'alg' => string 'HS384' (length=5)
      'type' => string 'JWT' (length=3)
  'payload' => 
    array (size=2)
      'iat' => int 1543041427
      'uid' => int 357

贡献

  1. 分支仓库
  2. 创建一个描述性的分支名称
  3. 对你的分支进行编辑
  4. 压缩(变基)你的提交
  5. 创建一个pull请求

许可证

本项目采用MIT许可证 - 详细信息请参阅LICENSE.md文件。