介绍
PHP
中编码和解码 JSON Web令牌(JWT)。elasticsearch
第三方提供的库如下(截止到2023.03.02):
安装
安装此扩展包的首选方法是通过 composer
,这里演示的版本为 6.3.0
。
composer require firebase/php-jwt:6.3.0
查看源码
集成代码
操作类封装
文件位置:src/EncryptTools.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?php
namespace PhpTools;
use PhpTools\Encrypt\PhpJWT; use stdClass;
class EncryptTools {
public static function jwtEncode($arr, $key, $alg) { return PhpJWT::encode($arr, $key, $alg); }
public static function jwtDecode($token, $key, $alg) { return PhpJWT::decode($token, $key, $alg); } }
|
JWT类封装
文件位置:src/Encrypt/PhpJWT.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
namespace PhpTools\Encrypt;
use Firebase\JWT\JWT; use Firebase\JWT\Key;
class PhpJWT { public static function encode($payload, $key, $alg) { return JWT::encode($payload, $key, $alg); }
public static function decode($jwt, $key, $alg) { return JWT::decode($jwt, new Key($key, $alg)); } }
|
简单使用
创建测试用例
文件位置:tests/Cases/EncryptTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| <?php
namespace ToolsTest\Cases;
use PHPUnit\Framework\TestCase; use PhpTools\EncryptTools;
class EncryptTest extends TestCase {
public function testJWTForHs() { $payload = [ "issuer" => "shershon", "issuer_at" => time(), "expires_at" => time() + 60 ]; $key = 'shershon'; $encryt = EncryptTools::jwtEncode($payload, $key, 'HS256'); $result['hs256-加密结果'] = $encryt; $result['hs256-解密结果'] = (array)EncryptTools::jwtDecode($encryt, $key, 'HS256'); print_r($result); }
public function testJWTForRs() { $privateKey = <<<EOD -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAuzWHNM5f+amCjQztc5QTfJfzCC5J4nuW+L/aOxZ4f8J3Frew M2c/dufrnmedsApb0By7WhaHlcqCh/ScAPyJhzkPYLae7bTVro3hok0zDITR8F6S JGL42JAEUk+ILkPI+DONM0+3vzk6Kvfe548tu4czCuqU8BGVOlnp6IqBHhAswNMM 78pos/2z0CjPM4tbeXqSTTbNkXRboxjU29vSopcT51koWOgiTf3C7nJUoMWZHZI5 HqnIhPAG9yv8HAgNk6CMk2CadVHDo4IxjxTzTTqo1SCSH2pooJl9O8at6kkRYsrZ WwsKlOFE2LUce7ObnXsYihStBUDoeBQlGG/BwQIDAQABAoIBAFtGaOqNKGwggn9k 6yzr6GhZ6Wt2rh1Xpq8XUz514UBhPxD7dFRLpbzCrLVpzY80LbmVGJ9+1pJozyWc VKeCeUdNwbqkr240Oe7GTFmGjDoxU+5/HX/SJYPpC8JZ9oqgEA87iz+WQX9hVoP2 oF6EB4ckDvXmk8FMwVZW2l2/kd5mrEVbDaXKxhvUDf52iVD+sGIlTif7mBgR99/b c3qiCnxCMmfYUnT2eh7Vv2LhCR/G9S6C3R4lA71rEyiU3KgsGfg0d82/XWXbegJW h3QbWNtQLxTuIvLq5aAryV3PfaHlPgdgK0ft6ocU2de2FagFka3nfVEyC7IUsNTK bq6nhAECgYEA7d/0DPOIaItl/8BWKyCuAHMss47j0wlGbBSHdJIiS55akMvnAG0M 39y22Qqfzh1at9kBFeYeFIIU82ZLF3xOcE3z6pJZ4Dyvx4BYdXH77odo9uVK9s1l 3T3BlMcqd1hvZLMS7dviyH79jZo4CXSHiKzc7pQ2YfK5eKxKqONeXuECgYEAyXlG vonaus/YTb1IBei9HwaccnQ/1HRn6MvfDjb7JJDIBhNClGPt6xRlzBbSZ73c2QEC 6Fu9h36K/HZ2qcLd2bXiNyhIV7b6tVKk+0Psoj0dL9EbhsD1OsmE1nTPyAc9XZbb OPYxy+dpBCUA8/1U9+uiFoCa7mIbWcSQ+39gHuECgYAz82pQfct30aH4JiBrkNqP nJfRq05UY70uk5k1u0ikLTRoVS/hJu/d4E1Kv4hBMqYCavFSwAwnvHUo51lVCr/y xQOVYlsgnwBg2MX4+GjmIkqpSVCC8D7j/73MaWb746OIYZervQ8dbKahi2HbpsiG 8AHcVSA/agxZr38qvWV54QKBgCD5TlDE8x18AuTGQ9FjxAAd7uD0kbXNz2vUYg9L hFL5tyL3aAAtUrUUw4xhd9IuysRhW/53dU+FsG2dXdJu6CxHjlyEpUJl2iZu/j15 YnMzGWHIEX8+eWRDsw/+Ujtko/B7TinGcWPz3cYl4EAOiCeDUyXnqnO1btCEUU44 DJ1BAoGBAJuPD27ErTSVtId90+M4zFPNibFP50KprVdc8CR37BE7r8vuGgNYXmnI RLnGP9p3pVgFCktORuYS2J/6t84I3+A17nEoB4xvhTLeAinAW/uTQOUmNicOP4Ek 2MsLL2kHgL8bLTmvXV4FX+PXphrDKg1XxzOYn0otuoqdAQrkK4og -----END RSA PRIVATE KEY----- EOD; $publicKey = <<<EOD -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzWHNM5f+amCjQztc5QT fJfzCC5J4nuW+L/aOxZ4f8J3FrewM2c/dufrnmedsApb0By7WhaHlcqCh/ScAPyJ hzkPYLae7bTVro3hok0zDITR8F6SJGL42JAEUk+ILkPI+DONM0+3vzk6Kvfe548t u4czCuqU8BGVOlnp6IqBHhAswNMM78pos/2z0CjPM4tbeXqSTTbNkXRboxjU29vS opcT51koWOgiTf3C7nJUoMWZHZI5HqnIhPAG9yv8HAgNk6CMk2CadVHDo4IxjxTz TTqo1SCSH2pooJl9O8at6kkRYsrZWwsKlOFE2LUce7ObnXsYihStBUDoeBQlGG/B wQIDAQAB -----END PUBLIC KEY----- EOD; $payload = [ "issuer" => "shershon", "issuer_at" => time(), "expires_at" => time() + 60 ]; $encryt = EncryptTools::jwtEncode($payload, $privateKey, 'RS256'); $result['rs256-加密结果'] = $encryt; $result['rs256-解密结果'] = (array)EncryptTools::jwtDecode($encryt, $publicKey, 'RS256'); print_r($result); } }
|
请求示例
加密方式是HS系列
1 2 3 4 5 6 7 8 9 10 11 12 13
| ➜ phpunit -c phpunit.xml --colors=always tests/Cases/EncryptTest.php --filter testJWTForHs Array ( [hs256-加密结果] => eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3N1ZXIiOiJzaGVyc2hvbiIsImlzc3Vlcl9hdCI6MTY3Nzc0MTkyMiwiZXhwaXJlc19hdCY3Nzc0MTk4Mn0.0g7DmFBwSTekIvc7JVi3JBcAy6j8rfUFy2DuMrjF_So [hs256-解密结果] => Array ( [issuer] => shershon [issuer_at] => 1677741922 [expires_at] => 1677741982 )
)
|
加密方式是RS系列
1 2 3 4 5 6 7 8 9 10 11 12
| ➜ phpunit -c phpunit.xml --colors=always tests/Cases/EncryptTest.php --filter testJWTForRs Array ( [rs256-加密结果] => eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3N1ZXIiOiJzaGVyc2hvbiIsImlzc3Vlcl9hdCI6MTY3Nzc0MTk2NSwiZXhwaXJlc19hdCY3Nzc0MjAyNX0.plqxDDNYu9REgzrdF9_MAopTSRl7yS3YK-4gf-5ZXy7iPCKKvsHQV-kHbu_VLX8TOMA7TcMqRQDpDTkfhg9R_6cX9OCP_fRzRwLjjn0acDnDlrjkEch_LYwaWHZcogBuHM9pdG-pkFM9B1JrAEPqGxxoHezmvy6z9d5_xoknMLGcJdNDXmoTaz4Z3xxAA0JoGRa9PHt9y2wontFBFR_wKV5HvF9mYgn6Lvz76LjkLN5KUtFfr58oBoiRh9Lbn8A7Divjdg7vrBhoS_qMCCLT5b-Zbc0_rkoSKRk8ni0N89HorCY-gDN2k4-4SOJqQDgSeNGHSDcDunrAhKfG3wDfSg [rs256-解密结果] => Array ( [issuer] => shershon [issuer_at] => 1677741965 [expires_at] => 1677742025 )
)
|