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其它相關文章!