首頁 >後端開發 >php教程 >如何使用PHP進行JWT鑑權與認證?

如何使用PHP進行JWT鑑權與認證?

WBOY
WBOY原創
2023-08-07 10:12:201396瀏覽

如何使用PHP進行JWT鑑權與認證?

JWT(JSON Web Token)是一種用於進行身份驗證和授權的開放標準。它可以透過一種安全可靠的方式在客戶端和伺服器之間傳輸數據,並允許伺服器驗證發送請求的用戶身份。本文將介紹如何使用PHP實作JWT的鑑權與認證功能。

  1. 安裝依賴函式庫
    JWT需要依賴兩個函式庫:Firebase PHP JWT和lcobucci/jwt。你可以使用Composer來安裝這兩個函式庫:
composer require firebase/php-jwt lcobucci/jwt
  1. 產生JWT
    首先,我們需要在使用者登入成功後產生一個JWT並傳送給客戶端。以下是一個範例程式碼:
<?php

use FirebaseJWTJWT;
use LcobucciJWTBuilder;
use LcobucciJWTSignerHmacSha256;

// 用户登录成功后,生成JWT
function generateJWT($userId, $secretKey) {
    $time = time();
    $token = (new Builder())
        ->issuedBy('example.com') // 发行者
        ->permittedFor('example.com') // 接受者
        ->identifiedBy('1', true) // 标识符
        ->issuedAt($time) // 发行时间
        ->expiresAt($time + 3600) // 过期时间
        ->withClaim('userId', $userId) // 自定义声明
        ->getToken(new Sha256(), new Key($secretKey));

    return $token;
}

$jwt = generateJWT(1, 'your-secret-key');
echo $jwt;
  1. 驗證JWT
    在伺服器端接收到客戶端的請求後,我們需要驗證JWT的合法性並取得使用者的身分資訊。以下是一個範例程式碼:
<?php

use FirebaseJWTJWT;

// 验证并解析JWT
function verifyJWT($jwt, $secretKey) {
    try {
        $decoded = JWT::decode($jwt, $secretKey, ['HS256']);
        return $decoded;
    } catch (Exception $e) {
        return null;
    }
}

$jwt = $_SERVER['HTTP_AUTHORIZATION'];
$decoded = verifyJWT($jwt, 'your-secret-key');

if ($decoded) {
    $userId = $decoded->userId;
    echo "用户ID:$userId";
} else {
    echo "无效的JWT";
}
  1. 刷新JWT
    JWT在一段時間後會過期,但我們可以使用刷新令牌來延長有效期。以下是一個範例程式碼:
<?php

use FirebaseJWTJWT;
use LcobucciJWTBuilder;
use LcobucciJWTSignerHmacSha256;

// 刷新JWT
function refreshJWT($jwt, $secretKey) {
    $current = time();
    $decoded = JWT::decode($jwt, $secretKey, ['HS256']);
    
    if ($decoded->exp - $current > 1800) { // 如果剩余有效期超过30分钟,则不刷新JWT
        return $jwt;
    }
    
    $newToken = (new Builder())
        ->issuedBy($decoded->iss)
        ->permittedFor($decoded->aud)
        ->identifiedBy($decoded->jti, true)
        ->issuedAt($current)
        ->expiresAt($current + 3600)
        ->withClaim('userId', $decoded->userId)
        ->getToken(new Sha256(), new Key($secretKey));
        
    return $newToken;
}

$jwt = $_SERVER['HTTP_AUTHORIZATION'];
$refreshedJWT = refreshJWT($jwt, 'your-secret-key');

echo $refreshedJWT;

透過上述步驟,我們可以使用PHP輕鬆實現JWT的鑑權和認證功能。當然,實際應用中還需要更多的安全考量和實踐,並根據具體需求進行調整。希望本文對你理解和使用JWT有幫助!

以上是如何使用PHP進行JWT鑑權與認證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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