lgrevelink / php-simple-jwt
用于创建 JSON Web Tokens (JWT) 并在 PHP 应用程序中使用它们的简单包。
1.0.0
2022-09-26 20:21 UTC
Requires
- php: >=7.3
Requires (Dev)
- phpunit/phpunit: ^7.0 | ^8.0
README
简单包,用于编码和解码 JSON Web Tokens (JWT) 并在 PHP 应用程序中使用。更多详细信息可在 RFC 7519 中找到。
支持的加密方法;
安装
composer require lgrevelink/php-simple-jwt
示例
基本未签名 JWT,但请记住,始终对您的令牌进行签名。
use LGrevelink\SimpleJWT\Token; $token = new Token([ 'custom' => 'payload', ]); $token->toString(); // > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJjdXN0b20iOiJwYXlsb2FkIn0.
带有蓝图示例
蓝图使生成和验证已创建的令牌变得更容易。它们是您实际令牌的抽象版本,并在定义时设置所有一般声明。
use LGrevelink\SimpleJWT\TokenBlueprint; class MyToken extends TokenBlueprint { protected static $audience = 'GitHub users'; protected static $expirationTime = 3600; protected static $issuedAt = 0; protected static $issuer = 'Developer'; protected static $subject = 'Blueprint example'; } $token = MyToken::generate([ /* Custom claims */ ]); $token->toString(); // > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiJHaXRIdWIgdXNlcnMiLCJleHAiOjE1NTk1NzkwNzgsImlhdCI6MTU1OTU3NTQ3OCwiaXNzIjoiRGV2ZWxvcGVyIiwic3ViIjoiQmx1ZXByaW50IGV4YW1wbGUifQ. MyToken::validate($token); // > true
蓝图中的所有日期相关参数都是相对于系统当前时间处理的。
签名与验证
HMAC
use LGrevelink\SimpleJWT\Token; use LGrevelink\SimpleJWT\Signing\Hmac\HmacSha256; $token = new Token(); $token->sign(new HmacSha256(), 'signing secret'); $token->toString(); // > eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.W10.o5-rpJi4_bEYcIWisa6qD7rFX6fk4Jh0FfNyOTmDbsI $token->verify(new HmacSha256(), 'signing secret'); // true
RSA
use LGrevelink\SimpleJWT\Signing\Rsa\Keys\PrivateKey; use LGrevelink\SimpleJWT\Signing\Rsa\Keys\PublicKey; use LGrevelink\SimpleJWT\Signing\Rsa\RsaSha256; use LGrevelink\SimpleJWT\Token; $privateKey = new PrivateKey('private_rsa.pem'); $token = new Token(); $token->sign(new RsaSha256($privateKey), 'possible passphrase'); $token->toString(); // > eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.W10.Tsm8x3WxQUa12n2FedJIHlObnLZBbPF_IczvcTAt25ZIaJlYOuka8S5GzdmJ6ZfD5UiHLTgbJG0pdpSwdnsKg44TyWj5Yl19qx6ddDKcfQxk7zaPTy6kDaCi5Hl6yC0WiXjgnvolD9Hp8fBYoYmcer-V0cFr50Ee9SfBuIejQPddlGvx7EfjZ0yIVNuxBD7Uzimio3VacomolpFAmJHPqLLSfrHKI9ITncyg9U_IpnwHcBUe3BBeHEUzeL8k9nvUKZof5vIAGsZ7o3xi0NbOMfYw5DhP8jCTgjKlqMfxlQVRI8cNPj852qfrf8CzYHvYuR_7uN1s8a_ooBfHjOxeYg $publicKey = new PublicKey('public_rsa.pem'); $token->verify(new RsaSha256(null, $publicKey)); // true
通过蓝图
签名也可以附加到 TokenBlueprint
上,以将所有内容包含在蓝图内,而不是在应用程序代码中的某个地方。
use LGrevelink\SimpleJWT\TokenBlueprint; use LGrevelink\SimpleJWT\TokenSignature; use LGrevelink\SimpleJWT\Signing\Hmac\HmacSha256; class MyToken extends TokenBlueprint { // ... public function signature($key) { return new TokenSignature(new HmacSha256(), $key); } } $token = MyToken::generate([ 'custom-claim' => 'data' ])->signature(MyToken::signature('some-key')); // or $token = MyToken::generateAndSign([ 'custom-claim' => 'data' ], 'some-key'); // or $token = MyToken::sign( SignatureBlueprintMock::generate([ 'custom-claim' => 'data' ]), 'some-key' );
所有在 TokenBlueprint::generateAndSign
和 TokenBlueprint::sign
后的参数都将代理到 TokenBlueprint::signature
方法,以便可以在那里使用。所有这些方法都可以单独使用或组合使用,以适应您的需求。
解析令牌
这部分应该很容易,就像 🍰 一样。只需投入您的字符串化令牌,解析后就可以使用。如果给定的令牌或令牌的一部分无法正确解析或解码,则会抛出 InvalidFormatException
。
use LGrevelink\SimpleJWT\Token; $token = Token::parse('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.W10.o5-rpJi4_bEYcIWisa6qD7rFX6fk4Jh0FfNyOTmDbsI');
测试
测试是用 PHPUnit 编写的,可以通过以下 composer 命令运行;
composer run test