byjg / jwt-wrapper
创建、编码、解码 JWT 令牌的简单包装器,并抽象 PHP JWT 组件
4.9.3
2024-08-25 16:57 UTC
Requires
- ext-openssl: *
- firebase/php-jwt: ^6
Requires (Dev)
- phpunit/phpunit: ^9.6
README
创建、编码、解码 JWT 令牌的简单包装器,并抽象 PHP JWT 组件
工作原理
此库旨在位于服务器端。
流程如下
无令牌
生成令牌
- JwtWrapper::createJwtData
- JwtWrapper::generateToken
带有令牌
验证令牌
- JwtWrapper::extractData
创建您的 Jwt 密钥
您可以使用两种类型的密钥。一种更快的哈希(HS512),或者更安全的 RSA(RS512)。
哈希密钥
openssl rand -base64 64 # set here the size of your key
RSA
ssh-keygen -t rsa -C "Jwt RSA Key" -b 2048 -f private.pem
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
注意:保存时不要使用密码
创建 JWT 令牌(哈希编码)
<?php $server = "example.com"; $secret = new \ByJG\Util\JwtKeySecret(base64_encode("secrect_key_for_test")); $jwtWrapper = new \ByJG\Util\JwtWrapper($server, $secret); $token = $jwtWrapper->createJwtData([ "key" => "value", "key2" => "value2" ]);
创建 JWT 令牌(RSA 编码)
<?php $server = "example.com"; $secret = <<<TEXT -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA5PMdWRa+rUJmg6QMNAPIXa+BJVN7W0vxPN3WTK/OIv5gxgmj 2inHGGc6f90TW/to948LnqGtcD3CD9KsI55MubafwBYjcds1o9opZ0vYwwdIV80c OVZX1IUZFTbnyyKcXeFmKt49A52haCiy4iNxcRK38tOCApjZySx/NzMDeaXuWe+1 nd3pbgYa/I8MkECa5EyabhZJPJo9fGoSZIklNnyq4TfAUSwl+KN/zjj3CXad1oDT 7XDDgMJDUu/Vxs7h3CQI9zILSYcL9zwttbLnJW1WcLlAAIaAfABtSZboznsStMnY to01wVknXKyERFs7FLHYqKQANIvRhFTptsehowIDAQABAoIBAEkJkaQ5EE0fcKqw K8BwMHxKn81zi1e9q1C6iEHgl8csFV03+BCB4WTUkaH2udVPJ9ZJyPArLbQvz3fS wl1+g4V/UAksRtRslPkXgLvWQ2k8KoTwBv/3nn9Kkozk/h8chHuii0BDs30yzSn4 SdDAc9EZopsRhFklv9xgmJjYalRk02OLck73G+d6MpDqX56o2UA/lf6i9MV19KWP HYip7CAN+i6k8gA0KPHwr76ehgQ6YHtSntkWS8RfVI8fLUB1UlT3HmLgUBNXMWkQ ZZbvXtNOt6NtW/WIAHEYeE9jmFgrpW5jKJSLn5iGVPFZwJIZXRPyELEs9NHWkS6e GmdzxnECgYEA8+m05B/tmeZOuMrPVJV9g+aBDcuxmW+sdLRch+ccSmx4ZNQOLVoU klYgTZq/a1O4ENq0h2WgccNlRHdcH4sXMBvLalA/tFhZMUuA/KXWyZ1F0hBnjHVF cj1alHCqh+9qJDGdn4mxSmrp8p0rfeWgBwlFtJEJmjjDWDCtVY+JZcsCgYEA8EuV WF/ilgDjgC4jMCYNuO0oFGBbtNP17PuU3kh8W+joqK/nufZ3NLy1WrDIpqa9YPex 328Nnjljf5GJWSdMchAp82waLzl7FaaBTY0iyFAK4J0jfC/fVLx82+wpM3utDnh8 9x5iIboO5U7uEJ7k8X2p64GoprlKJSRmGAJ7eIkCgYEAw5IsXI3NMY0cqcbUHvoO PehgqfMdX+3O1XSYjM+eO35lulLdWzfTLtKn7BGcUi46dCkofzfZQd5uIEukLhaU bRqcK45UxgHg4kmsDufaJKZaCWjl3hVZrZPMQSFlWsF41bSCshzxbr3y/3lOGhA4 E+w3W+S/Uk0ZNGkzUltYy6kCgYEA0gRNeBr9z7rhG4O3j3qC3dCxCfYZ0Na8hy5v M0PJJQ9QYTa04iyOjVItcyE1jaoHtLtoA+9syJBB7RoHIBufzcVg1Pbzf7jOYeLP +jbTYp3Kk/vjKsQwfj/rJM+oRu3eF9qo5dbxT6btI++zVGV7lbEOFN6Sx30EV6gT bwKkZXkCgYEAnEtN43xL8bRFybMc1ZJErjc0VocnoQxCHm7LuAtLOEUw6CwwFj9Q GOl+GViVuDHUNQvURLn+6gg4tAemYlob912xIPaU44+lZzTMHBOJBGMJKi8WogKi V5+cz9l31uuAgNfjL63jZPaAzKs8Zx6R3O5RuezympwijCIGWILbO2Q= -----END RSA PRIVATE KEY----- TEXT; $public = <<<TEXT -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5PMdWRa+rUJmg6QMNAPI Xa+BJVN7W0vxPN3WTK/OIv5gxgmj2inHGGc6f90TW/to948LnqGtcD3CD9KsI55M ubafwBYjcds1o9opZ0vYwwdIV80cOVZX1IUZFTbnyyKcXeFmKt49A52haCiy4iNx cRK38tOCApjZySx/NzMDeaXuWe+1nd3pbgYa/I8MkECa5EyabhZJPJo9fGoSZIkl Nnyq4TfAUSwl+KN/zjj3CXad1oDT7XDDgMJDUu/Vxs7h3CQI9zILSYcL9zwttbLn JW1WcLlAAIaAfABtSZboznsStMnYto01wVknXKyERFs7FLHYqKQANIvRhFTptseh owIDAQAB -----END PUBLIC KEY----- TEXT; # Note that if you want to use RSA just pass the 3rd argument (public key) # See above how to create the RSA Key pair. $jwtKey = new \ByJG\Util\JwtRsaKey($secret, $public); $jwtWrapper = new \ByJG\Util\JwtWrapper($server, $jwtKey); $token = $jwtWrapper->createJwtData([ "key" => "value", "key2" => "value2" ]);
提取
<?php # If exists $_SERVER['HTTP_AUTHENTICATION'] = "Bearer $TOKEN" $data = $jwtWrapper->extractData(); # If you want decode directly: $data = $jwtWrapper->extractData($token);
发行者验证
默认情况下,发行者与服务器名称进行验证。如果您想禁用此验证,可以调用以下方法
$data = $jwtWrapper->extractData($token, false); // Setting false disables the issuer validation
添加容差
您可以在签名服务器和验证服务器之间的时钟偏差时添加容差。建议此容差不应超过几分钟。
$jwtWrapper->setLeeway(60)
重要:由于 Firebase JWT 类将容差值设置为“静态”属性,一旦调用上述方法,它将设置相同的值到所有 JwtWrapper 实例中
安装
composer require "byjg/jwt-wrapper"
运行测试
vendor/bin/phpunit
运行示例测试
启动本地服务器
php -S localhost:8080
使用您的网络浏览器访问 client.html
http://localhost:8080/client.html