tungltdev/laravel-php-jwt

一个用于在PHP中编码和解码JSON Web Tokens (JWT)的简单库。

2.0 2022-11-28 06:49 UTC

This package is auto-updated.

Last update: 2024-09-11 06:42:55 UTC


README

使用composer管理依赖并下载LARAVEL-JWT

composer require tungltdev/laravel-php-jwt

Tungltdev\LARAVEL\JWT\JwtAuthTokenProvider::class  add to config/app.php

php artisan vendor:publish --provider="Tungltdev\LARAVEL\JWT\JwtAuthTokenProvider"
hoặc
php artisan vendor:publish --provider="Tungltdev\LARAVEL\JWT\JwtAuthTokenProvider" --force

config/jwt.php 文件中的config key

向api添加中间件

protected $routeMiddleware = [ ... 'jwt.auth' => \App\Http\Middleware\VerifyJWTToken::class, ...

在api.php中添加行

Route::group(['middleware' => 'jwt.auth'], function () { Route::post('/address_member', 'AddressMemberController@store'); });

获取用户jwt信息:$request->jwtUser

dd($request->jwtUser); 示例

<?php

$payload  = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

/**
 * IMPORTANT:
 * You must specify supported algorithms for your application. See
 * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
 * for a list of spec-compliant algorithms.
 */
$jwt = jwtEncode($payload); 
$decoded = jwtDecode($jwt, 'HS256');

print_r($decoded);

/*
 NOTE: This will now be an object instead of an associative array. To get
 an associative array, you will need to cast it as such:
*/

$decoded_array = (array) $decoded;

/**
 * You can add a leeway to account for when there is a clock skew times between
 * the signing and verifying servers. It is recommended that this leeway should
 * not be bigger than a few minutes.
 *
 * Source: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef
 */
jwtEncode(60); // $leeway in seconds
$decoded = jwtDecode($jwt, 'HS256');

?>
supported_algs
------------------------
    'HS256' => array('hash_hmac', 'SHA256'),
    'HS512' => array('hash_hmac', 'SHA512'),
    'HS384' => array('hash_hmac', 'SHA384'),
    'RS256' => array('openssl', 'SHA256'),
    'RS384' => array('openssl', 'SHA384'),
    'RS512' => array('openssl', 'SHA512'),

JWT定义了一些保留的声明名称,并定义了它们的使用方式。JWT支持这些保留的声明名称

'exp' (Expiration Time) Claim
'nbf' (Not Before Time) Claim
'iss' (Issuer) Claim
'iat' (Issued At) Claim

过期时间声明 The exp (expiration time) 声明标识JWT不应被接受的过期时间。处理exp声明的当前日期/时间必须在exp声明中列出的过期日期/时间之前。实现者可能提供一些小的宽容度,通常不超过几分钟,以考虑时钟偏差。它的值必须是一个包含数字日期值的数字。使用此声明是可选的。

不早于时间声明 The nbf (not before) 声明标识JWT不应被接受的最早时间。处理nbf声明的当前日期/时间必须在nbf声明中列出的不早于日期/时间之后或等于。实现者可能提供一些小的宽容度,通常不超过几分钟,以考虑时钟偏差。它的值必须是一个包含数字日期值的数字。使用此声明是可选的

发行者声明 The iss (issuer) 声明标识发行JWT的实体。此声明的处理通常是特定于应用程序的。iss值是一个包含字符串或URI值的敏感字符串。使用此声明是可选的。

发行时间声明 The iat (issued at) 声明标识JWT被发行的时间。此声明可以用来确定JWT的年龄。它的值必须是一个包含数字日期值的数字。使用此声明是可选的。

使用RS256 (openssl)的示例

<?php

$privateKey = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn
vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9
5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB
AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz
bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J
Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1
cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5
5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck
ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe
k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb
qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k
eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm
B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM=
-----END RSA PRIVATE KEY-----
EOD;

$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H
4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t
0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4
ehde/zUxo6UvS7UrBQIDAQAB
-----END PUBLIC KEY-----
EOD;


$payload = array(
    "iss" => "example.org",
    "aud" => "example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

$jwt = jwtEncode($payload, 'RS256', $privateKey);
echo "Encode:\n" . print_r($jwt, true) . "\n";

$decoded = jwtDecode($jwt, 'RS256', $publicKey);

/*
 NOTE: This will now be an object instead of an associative array. To get
 an associative array, you will need to cast it as such:
*/

$decoded_array = (array) $decoded;
echo "Decode:\n" . print_r($decoded_array, true) . "\n";
?>