1. 程式人生 > 其它 >PHP利用JWT實現token和refresh_token

PHP利用JWT實現token和refresh_token

 引入
composer require firebase/php-jwt

require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
  1. 生成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
}
  1. 驗證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
}
  1. 同時生成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資訊
}