介绍

PHP 中编码和解码 JSON Web令牌(JWT)。elasticsearch 第三方提供的库如下(截止到2023.03.02):

文档 star数量 说明
firebase/php-jwt https://github.com/firebase/php-jwt/blob/main/README.md 8.6k firebase提供

安装

安装此扩展包的首选方法是通过 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;

/**
* @Description: 轻量级加解密
* @Class EncryptTools
* @Package PhpTools
*/
class EncryptTools
{
/**
* 生成jwt
*
* @param $arr
* @param $key
* @param $alg
* @return string
*/
public static function jwtEncode($arr, $key, $alg) {
return PhpJWT::encode($arr, $key, $alg);
}

/**
* 解析jwt
*
* @param $token
* @param $key
* @param $alg
* @return stdClass
*/
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
{
/**
* JWT,加密方式是HS系列
* HS256,HS384,HS512
*
* @return void
*/
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);
}

/**
* JWT,加密方式是RS系列
* RS256,RS384,RS512
*
* @return void
*/
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
)

)