PHP利用JWT實現token和refresh_token
阿新 • • 發佈:2022-03-13
引入
composer require firebase/php-jwt
require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
- 生成token
public function getToken() { $key = 'key'; // key $time = time(); // 當前時間 $token = [ 'iss' => 'http://www.buddha.com', // 簽發者 可選 'aud' => 'http://www.buddha.com', // 接收該JWT的一方,可選 'iat' => $time, // 簽發時間 'nbf' => $time , // (Not Before):某個時間點後才能訪問,比如設定time+30,表示當前時間30秒後才能使用 'exp' => $time + 7200, // 過期時間,這裡設定2個小時 'data' => [ // 自定義資訊,不要定義敏感資訊 'id' => 1, 'username' => 'buddha' ] ]; return JWT::encode($token, $key); // 輸出Token }
- 驗證token
public function verification() { $key = 'key'; // key要和簽發的時候一樣 $jwt = ""; // 簽發的Token try { JWT::$leeway = 60; // 當前時間減去60,把時間留點餘地 $decoded = JWT::decode($jwt, $key, ['HS256']); // HS256方式,這裡要和簽發的時候對應 $arr = (array)$decoded; return $arr; } catch(\Firebase\JWT\SignatureInvalidException $e) { // 簽名不正確 echo $e->getMessage(); }catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之後才能用 echo $e->getMessage(); }catch(\Firebase\JWT\ExpiredException $e) { // token過期 echo $e->getMessage(); }catch(Exception $e) { // 其他錯誤 echo $e->getMessage(); } // Firebase定義了多個throw new,我們可以捕獲多個catch來定義問題,catch加入自己的業務 // 比如token過期可以用當前Token重新整理一個新Token }
- 同時生成token和refresh_token
public function authorizations() { $key = 'ffdsfsd@4_45'; // key $time = time(); // 當前時間 // 自定義資訊 $token = [ 'iss' => 'http://www.buddha.com', // 簽發者 可選 'iat' => $time, // 簽發時間 'data' => [ // 自定義資訊,不要定義敏感資訊 'id' => 1, 'username' => 'buddha' ] ]; $access_token = $token; $access_token['scopes'] = 'role_access'; // token標識,請求介面的token $access_token['exp'] = $time + 7200; // access_token過期時間,這裡設定2個小時 $refresh_token = $token; $refresh_token['scopes'] = 'role_refresh'; // token標識,重新整理access_token $refresh_token['exp'] = $time + (86400 * 30); // access_token過期時間,這裡設定30天 $jsonList = [ 'access_token' => JWT::encode($access_token, $key), 'refresh_token' => JWT::encode($refresh_token, $key), 'token_type' => 'bearer' // token_type:表示令牌型別,該值大小寫不敏感,這裡用bearer ]; // header("HTTP/1.1 201 Created"); return json_encode($jsonList); // 返回給客戶端token資訊 }