PHP使用JWT建立Token簡單範例
#依賴
環境:php 5.5 以上 OpenSSL擴充功能
lcobucci/JWT
可使用composer 安裝
composer require lcobucci/jwt
#也可直接到## GitHub下載
GitHub位址: https://github.com/lcobucci/jwt
參數解釋
要求實體,可以是發起請求的使用者的訊息,也可以是jwt的簽發者 | |
設定主題,類似於發送郵件時的主題 |
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中文網其他相關文章!