首頁  >  文章  >  後端開發  >  使用 JWT(JSON Web Token) Blacklist 實作 PHP 安全驗證

使用 JWT(JSON Web Token) Blacklist 實作 PHP 安全驗證

WBOY
WBOY原創
2023-07-24 19:21:311687瀏覽

使用 JWT(JSON Web Token) Blacklist 實作 PHP 安全驗證

隨著網路的發展,Web 應用程式的安全性變得越來越重要。在實作 PHP 應用程式的安全驗證時,我們可以使用 JWT(JSON Web Token) 作為安全驗證的解決方案。而為了增加 JWT 的安全性,我們可以使用 Blacklist 來管理已失效的 Token。

JWT 是一種用於進行身份驗證和授權的開放標準(RFC 7519)。它由三個部分組成:Header、Payload 和 Signature。 Header 包含演算法和 Token 類型的信息,Payload 包含使用者的資料訊息,而 Signature 則是根據 Header、Payload 和 Secret Key 簽名產生的。

使用 JWT 進行身份驗證的流程如下:

  1. 使用者使用使用者名稱和密碼登入。
  2. 伺服器驗證使用者的使用者名稱和密碼,並產生 JWT。
  3. 伺服器將 JWT 傳送給客戶端。
  4. 客戶端將 JWT 儲存在 Cookie 或 Local Storage 中。
  5. 客戶端發送請求時,在請求的 Header 中帶上 JWT。
  6. 伺服器接收到請求後,驗證 JWT 的有效性,如果驗證通過,則繼續處理請求。

然而,如果 JWT 的有效時間很長,那麼一旦 Token 洩露,攻擊者就可以一直使用這個 Token 進行非法操作。為了解決這個問題,我們可以使用 Blacklist 來管理已失效的 Token,當使用者登出或修改密碼時,將相關的 Token 加入 Blacklist 中。

以下是使用 JWT Blacklist 實作 PHP 安全驗證的程式碼範例:

// 定义 JWT 的 Secret Key
$secretKey = "your_secret_key";

// 生成 JWT
function generateJWT($userId) {
    global $secretKey;

    $header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
    $payload = json_encode(['userId' => $userId]);

    $base64UrlHeader = base64UrlEncode($header);
    $base64UrlPayload = base64UrlEncode($payload);

    $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secretKey, true);
    $base64UrlSignature = base64UrlEncode($signature);

    return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
}

// 验证 JWT 是否有效
function validateJWT($jwt) {
    global $secretKey;

    list($base64UrlHeader, $base64UrlPayload, $base64UrlSignature) = explode('.', $jwt);

    $signature = base64UrlDecode($base64UrlSignature);
    $expectedSignature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secretKey, true);

    if ($signature !== $expectedSignature) {
        return false;
    }

    $payload = json_decode(base64UrlDecode($base64UrlPayload), true);

    // 在 Blacklist 中查找当前 Token 是否存在
    if (isTokenBlacklisted($jwt)) {
        return false;
    }

    return $payload['userId'];
}

// 将字符串进行 Base64Url 编码
function base64UrlEncode($data) {
    $base64 = base64_encode($data);
    if ($base64 === false) {
        return false;
    }

    // 替换特殊字符
    $base64Url = strtr($base64, '+/', '-_');

    // 删除 = 字符
    $base64Url = rtrim($base64Url, '=');

    return $base64Url;
}

// 将 Base64Url 编码的字符串解码
function base64UrlDecode($base64Url) {
    // 添加 = 字符
    $base64 = str_pad(strtr($base64Url, '-_', '+/'), strlen($base64Url) % 4, '=', STR_PAD_RIGHT);

    return base64_decode($base64);
}

// 将 Token 加入 Blacklist
function blacklistToken($jwt) {
    // 在数据库或缓存中将 Token 标记为失效
}

// 判断 Token 是否在 Blacklist 中
function isTokenBlacklisted($jwt) {
    // 在数据库或缓存中查询 Token 是否存在
}

使用上述程式碼範例,我們可以在 PHP 應用程式中方便地實作 JWT 的安全驗證和 Blacklist 的管理。透過使用 JWT 和 Blacklist,我們可以增加身份驗證的安全性,提高 Web 應用程式的防護能力。

總結:
本文介紹如何使用 JWT 和 Blacklist 實作 PHP 安全驗證。透過 JWT,我們可以安全地傳輸使用者訊息,並且使用 Blacklist 對已失效的 Token 進行管理,增加了身份驗證的安全性。在實際開發中,我們可以根據實際需求對程式碼進行最佳化和擴展,以滿足特定場景下的安全需求。

參考連結:
[1] JSON Web Token (JWT) - https://jwt.io/
[2] RFC 7519 - https://tools.ietf.org/html /rfc7519

以上是使用 JWT(JSON Web Token) Blacklist 實作 PHP 安全驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn