首頁 >後端開發 >php教程 >PHP使用JWT創建Token的實例詳解

PHP使用JWT創建Token的實例詳解

coldplay.xixi
coldplay.xixi轉載
2020-06-09 10:12:045500瀏覽


PHP使用JWT創建Token的實例詳解

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 Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
$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 Lcobucci\JWT\Signer\Hmac\Sha256;
$parse = (new Parser())->parse($token);
$signer = new Sha256();
$parse->verify($signer,'签名key');// 验证成功返回true 失败false
#######第二種:使用RSA和ECDSA簽章####### ###############RSA和ECDSA簽章是基於公鑰和私鑰,所以必須使用私鑰產生和驗證使用###
use Lcobucci\JWT\Signer\Keychain;
// 注意这里使用的sha256
use Lcobucci\JWT\Signer\Rsa\Sha256; 
$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 \Lcobucci\JWT\Signer\Rsa\Sha256();
$keychain = new \Lcobucci\JWT\Signer\Keychain();
$parse = new \Lcobucci\JWT\Parser();
$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的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:liqingbo.cn。如有侵權,請聯絡admin@php.cn刪除