adhocore/jwt

适用于PHP5.5+的超轻量级JSON Web Token (JWT) 库。

1.1.2 2021-02-20 09:56 UTC

This package is auto-updated.

Last update: 2024-09-06 09:44:44 UTC


README

如果你对JWT不熟悉或想重新熟悉它,请查看 jwt.io

Latest Version Build Scrutinizer CI Codecov branch StyleCI Software License Tweet Support

  • 适用于PHP7, PHP8以及更高版本的轻量级JSON Web Token (JWT) 库。
  • 无依赖(无供应商膨胀)。
  • 如果你仍然使用PHP5.6,请使用版本 0.1.2

安装

# PHP7.x, PHP8.x
composer require adhocore/jwt

# PHP5.6 (deprecated)
composer require adhocore/jwt:0.1.2

# For PHP5.4-5.5 (deprecated), use version 0.1.2 with a polyfill for https://php.ac.cn/hash_equals

功能

  • 支持六种算法
'HS256', 'HS384', 'HS512', 'RS256', 'RS384', 'RS512'
  • 支持kid
  • 支持0-120秒的容差。
  • 测试时支持时间戳欺骗。
  • 支持RS*算法的密语。

使用

use Ahc\Jwt\JWT;

// Instantiate with key, algo, maxAge and leeway.
$jwt = new JWT('secret', 'HS256', 3600, 10);

只需要密钥。其余默认使用

$jwt = new JWT('secret');
// algo = HS256, maxAge = 3600, leeway = 0

对于RS*算法,密钥可以是以下资源类型

$key = openssl_pkey_new([
    'digest_alg' => 'sha256',
    'private_key_bits' => 1024,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

或者,一个包含RSA私钥完整路径的字符串如下

$key = '/path/to/rsa.key';

// Then, instantiate JWT with this key and RS* as algo:
$jwt = new JWT($key, 'RS384');

专业 您不需要指定公钥路径,它可以从私钥推导出来。

从有效载荷数组生成JWT令牌

$token = $jwt->encode([
    'uid'    => 1,
    'aud'    => 'http://site.com',
    'scopes' => ['user'],
    'iss'    => 'http://api.mysite.com',
]);

检索有效载荷数组

$payload = $jwt->decode($token);

单行

$token   = (new JWT('topSecret', 'HS512', 1800))->encode(['uid' => 1, 'scopes' => ['user']]);
$payload = (new JWT('topSecret', 'HS512', 1800))->decode($token);

专业

可以在encode()的第二个参数中传递额外的标头

$token = $jwt->encode($payload, ['hdr' => 'hdr_value']);

测试模拟

欺骗time()以测试令牌过期

$jwt->setTestTimestamp(time() + 10000);

// Throws Exception.
$jwt->parse($token);

再次调用不带参数以停止欺骗time()

$jwt->setTestTimestamp();

带有kid的示例

$jwt = new JWT(['key1' => 'secret1', 'key2' => 'secret2']);

// Use key2
$token = $jwt->encode(['a' => 1, 'exp' => time() + 1000], ['kid' => 'key2']);

$payload = $jwt->decode($token);

$token = $jwt->encode(['a' => 1, 'exp' => time() + 1000], ['kid' => 'key3']);
// -> Exception with message Unknown key ID key3

稳定性

该库现在被标记为版本1.*.*,在功能和API方面是稳定的。

集成

Phalcon

查看 adhocore/phalcon-ext.

考虑

注意一些安全相关的考虑因素,如这里所述,这适用于任何JWT实现。