PHP使用JWT建立Token的範例詳解

2020-07-16 10:05:57

PHP使用JWT建立Token簡單範例

依賴

環境:php 5.5 以上 + OpenSSL擴充套件

lcobucci/JWT

可使用composer 安裝

composer require lcobucci/jwt

也可以直接到 GitHub下載

GitHub地址: https://github.com/lcobucci/jwt

引數解釋



iss (issuer)issuer請求實體,可以是發起請求的使用者的資訊,也可是jwt的簽發者
sub (Subject)設定主題,類似於發郵件時的主題
aud (audience)接收jwt的一方
exp (expire)token過時間期
nbf (not before)當前時間在nbf設定時間之前,該token無法使用
iat (issued at)token建立時間
jti (JWT ID)對當前token設定唯一標示

範例前準備

下面記錄主要的依賴參照:

define('DS', DIRECTORY_SEPARATOR);
define('JWTPath', dirname(__FILE__) . DS);
include_once JWTPath . 'Builder.php';
include_once JWTPath . 'Signer.php';
include_once JWTPath . 'Signer' . DS . 'Keychain.php';
include_once JWTPath . 'Signer' . DS . 'Rsa.php';
include_once JWTPath . 'Signer' . DS . 'Rsa' . DS . 'Sha256.php';

當然它們裡面還有更多的參照需要你自己加,這個在你偵錯時根據錯誤提示一個個補就好了,這裡就不多寫了。

範例

使用【lcobucci/JWT】產生 Token 的方式有兩種,在這裡我只試驗了第二種。

第一種:使用秘鑰簽名生成 token

use LcobucciJWTBuilder;
use LcobucciJWTSignerHmacSha256;
$builder = new Builder();
$signer = new Sha256();
// 設定發行人
$builder->setIssuer('http://example.com'); 
// 設定接收人
$builder->setAudience('http://example.org'); 
// 設定id
$builder->setId('4f1g23a12aa', true); 
// 設定生成token的時間
$builder->setIssuedAt(time()); 
// 設定在60秒內該token無法使用
$builder->setNotBefore(time() + 60); 
// 設定過期時間
$builder->setExpiration(time() + 3600); 
// 給token設定一個id
$builder->set('uid', 1); 
// 對上面的資訊使用sha256演算法簽名
$builder->sign($signer, '簽名key');
// 獲取生成的token
$token = $builder->getToken();

驗證 Token

use LcobucciJWTSignerHmacSha256;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
$parse->verify($signer,'簽名key');// 驗證成功返回true 失敗false

第二種:使用RSA和ECDSA簽名

RSA和ECDSA簽名是基於公鑰和私鑰,所以必須使用私鑰生成和驗證使用

use LcobucciJWTSignerKeychain;
// 注意這裡使用的sha256
use LcobucciJWTSignerRsaSha256; 
$signer = new Sha256();
$keychain = new Keychain();
$builder = new Builder();
$builder->setIssuer('http://example.com');
$builder->setAudience('http://example.org');
$builder->setId('4f1g23a12aa', true);
$builder->setIssuedAt(time());
$builder->setNotBefore(time() + 60);
$builder->setExpiration(time() + 3600);
$builder->set('uid', 1);
// 與上面不同的是這裡使用的是你的私鑰,並提供私鑰的地址
$builder->sign($signer, $keychain->getPrivateKey('file://{私鑰地址}'));
$toekn = $builder->getToken();

最後還可以通過強制轉換的形式來拿到你想要的純字串的 Token

$toekn = (string) $builder->getToken();

和前端的互動可以放在返回的 JSON 格式中通過引數帶過去,也可以存放在 header Authorization 中。

驗證 Token

$signer = new LcobucciJWTSignerRsaSha256();
$keychain = new LcobucciJWTSignerKeychain();
$parse = new LcobucciJWTParser();
$parse->parse((string)$token);
var_dump($token->verify($signer, $keychain->getPublicKey(self::$dir . '/public.key')));
))

獲取資料

因為資料部分可以直接獲取到,不用解密。所以在驗證token合法後直接讀取即可,這也是不要在載體中存放敏感資訊的原因。

$parse = (new Parser())->parse($token);
// 獲取全部資訊,返回一個陣列,
var_dump($parse->getClaims());
// 獲取單條資訊
var_dump($parse->getClaim('aud'));

推薦教學:《PHP視訊教學

以上就是PHP使用JWT建立Token的範例詳解的詳細內容,更多請關注TW511.COM其它相關文章!