深入解析在 WordPress 中實現(xiàn) JWT 身份驗證的完整指南

圖片[1]-深入解析在 WordPress 中實現(xiàn) JWT 身份驗證的完整指南-光子波動網(wǎng) | 專業(yè)WordPress修復服務(wù),全球范圍,快速響應(yīng)

JWT(JSON Web Token)是一種輕量級、自包含、用于身份驗證和授權(quán)的令牌,它將用戶信息(如用戶ID、角色和權(quán)限等)編碼到一個 JSON 對象中,然后對其進行數(shù)字簽名,從而生成一個經(jīng)過簽名的令牌。本文將詳細介紹 JWT 的概念、結(jié)構(gòu),并講解如何在 WordPress 中實現(xiàn) JWT 的生成和驗證。

什么是 JWT?

JWT 是一種安全機制,常用于無狀態(tài)的 RESTful API 認證。它允許服務(wù)器對傳遞的令牌進行驗證,從而保證用戶身份的真實性。由于 JWT 在客戶端和服務(wù)器之間傳輸時是加密的,因此可以防止信息被篡改。

JWT 的結(jié)構(gòu)

圖片[2]-深入解析在 WordPress 中實現(xiàn) JWT 身份驗證的完整指南-光子波動網(wǎng) | 專業(yè)WordPress修復服務(wù),全球范圍,快速響應(yīng)

JWT 由三部分組成:Header(頭部)、Payload(負載)和 Signature(簽名),它們通過點(.)連接,形成一個完整的 JWT,如下所示:

header.payload.signature
  1. Header(頭部)

Header 是一個 JSON 對象,包含兩個屬性:alg(簽名算法)和 typ(令牌類型)。常見的簽名算法有 HS256、RS256 等。Header 會被 Base64Url 編碼,生成如下字符串:

{
  "alg": "HS256",
  "typ": "JWT"
}
  1. Payload(負載)

Payload 也是一個 JSON 對象,包含用戶信息和其它業(yè)務(wù)數(shù)據(jù)。聲明可以是預定義的(如 iss、exp、sub 等),也可以是自定義的。Payload 同樣會被 Base64Url 編碼,生成如下字符串:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

預定義字段包括:

  • iss (issuer):簽發(fā)人
  • sub (subject):主題
  • aud (audience):受眾
  • exp (expiration time):過期時間
  • nbf (Not Before):生效時間
  • iat (Issued At):簽發(fā)時間
  • jti (JWT ID):唯一身份標識
  1. Signature(簽名)

簽名用于保證 JWT 的完整性和安全性。它將 Header、Payload 和一個密鑰(Secret)通過簽名算法進行加密。示例如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

生成的簽名會被附加到 JWT 的末尾,形成完整的 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

在 WordPress 中實現(xiàn) JWT

在 WordPress 中實現(xiàn) JSON Web Token (JWT) 身份驗證涉及以下步驟:

步驟 1:安裝 JWT Authentication 插件

  1. 登錄到你的 WordPress 管理后臺。
  2. 導航到 插件 > 安裝新插件。
  3. 搜索 JWT Authentication for WP REST API。
  4. 安裝并激活該插件。
圖片[3]-深入解析在 WordPress 中實現(xiàn) JWT 身份驗證的完整指南-光子波動網(wǎng) | 專業(yè)WordPress修復服務(wù),全球范圍,快速響應(yīng)

步驟 2:配置插件

  1. 激活插件后,導航到 設(shè)置 > JWT Authentication
  2. 在設(shè)置頁面中,你需要配置以下選項:
    • Secret Key:這是用于簽署 JWT 的密鑰。你可以在 wp-config.php 文件中添加以下代碼行來設(shè)置密鑰:define('JWT_AUTH_SECRET_KEY', 'your-secret-key');
    • Enable CORS:如果你有跨域請求的需求,可以啟用這個選項。

步驟 3:配置 .htaccess 文件

在你的網(wǎng)站根目錄下的 .htaccess 文件中添加以下規(guī)則:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

步驟4:生成 JWT

以下是一個用于生成 JWT 的函數(shù):

function wpjam_generate_jwt($payload, $secret='', $header=[]){
    // 無法生成沒有設(shè)置過期時間的 JWT
    if(empty($payload['exp'])){
        return false;
    }

    $header = wp_parse_args($header, [
        'alg' => 'HS256',
        'typ' => 'JWT'
    ]);

    if($header['alg'] == 'HS256'){
        $header     = base64_urlencode(wpjam_json_encode($header));
        $payload    = base64_urlencode(wpjam_json_encode($payload));
        $jwt        = $header.'.'.$payload;
        $secret     = $secret ?: wp_salt();

        return $jwt.'.'.base64_urlencode(hash_hmac('sha256', $jwt, $secret, true));
    }
}

上述代碼首先對 Header 和 Payload 進行 JSON 編碼和 URL 安全的 Base64 編碼。生成簽名的密鑰(Secret)如果為空,則使用 WordPress 默認的鹽值函數(shù)來生成。最后將 Header、Payload 和生成的簽名通過點(.)連接起來,形成一個完整的 JWT。

步驟5:驗證 JWT

驗證 JWT 的過程是生成的反過程,具體實現(xiàn)如下:

function wpjam_verify_jwt($token, $secret=''){
    $tokens = explode('.', $token);

    if(count($tokens) != 3){
        return false;
    }

    list($header, $payload, $sign) = $tokens;

    $jwt    = $header.'.'.$payload;
    $secret = $secret ?: wp_salt();
    $header = wpjam_json_decode(base64_urldecode($header));
    $payload= wpjam_json_decode(base64_urldecode($payload));

    if(empty($header['alg']) || $header['alg'] != 'HS256'){
        return false;
    }

    if(!hash_equals(base64_urlencode(hash_hmac('sha256', $jwt, $secret, true)), $sign)){
        return false;
    }

    // 簽發(fā)時間大于當前服務(wù)器時間驗證失敗
    if(isset($payload['iat']) && $payload['iat'] > time()){
        return false;
    }

    // 該 nbf 時間之前不接收處理該 Token
    if(isset($payload['nbf']) && $payload['nbf'] > time()){
        return false;
    }

    // 沒有設(shè)置過期時間,或過期時間小于當前服務(wù)器時間驗證失敗
    if(empty($payload['exp']) || $payload['exp'] < time()){
        return false;
    }

    return $payload;
}

上面的代碼首先通過點(.)將 JWT 分割成 Header、Payload 和 Signature 三段,然后對 Header 和 Payload 進行 URL 安全的 Base64 解碼和 JSON 解碼。通過簽名的密鑰最后驗證簽名的正確性。如果簽名有效并且令牌未過期,則返回 Payload 數(shù)據(jù)。

步驟6:Base64 URL 編碼和解碼函數(shù)

在上述過程中用到的 URL 安全的 Base64 編碼和解碼函數(shù) base64_urlencodebase64_urldecode 也需要定義:

function base64_urlencode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64_urldecode($data) {
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
圖片[4]-深入解析在 WordPress 中實現(xiàn) JWT 身份驗證的完整指南-光子波動網(wǎng) | 專業(yè)WordPress修復服務(wù),全球范圍,快速響應(yīng)

總結(jié)

通過 wpjam_generate_jwtwpjam_verify_jwt 這兩個函數(shù),可以在 WordPress 中實現(xiàn) JWT 的生成和驗證。JWT 提供了一種安全、無狀態(tài)的方式來認證用戶,在現(xiàn)代 Web 開發(fā)中越來越流行。


聯(lián)系我們
教程看不懂?聯(lián)系我們?yōu)槟赓M解答!免費助力個人,小企站點!
客服微信
客服微信
電話:020-2206-9892
QQ咨詢:1025174874
郵件:info@361sale.com
工作時間:周一至周五,9:30-18:30,節(jié)假日休息
? 轉(zhuǎn)載聲明
本文作者:xiesong
THE END
喜歡就支持一下吧
點贊0 分享
評論 搶沙發(fā)

請登錄后發(fā)表評論

    暫無評論內(nèi)容