adhocore / jwt
适用于PHP5.5+的超轻量级JSON Web Token (JWT) 库。
1.1.2
2021-02-20 09:56 UTC
Requires
- php: ^7.0 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^6.5 || ^7.5
README
如果你对JWT不熟悉或想重新熟悉它,请查看 jwt.io
- 适用于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
考虑
注意一些安全相关的考虑因素,如这里所述,这适用于任何JWT实现。