国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
JWT標(biāo)頭
JWT的有效負(fù)載
JWT的簽名
先決條件
登錄表單
使用JWT
驗(yàn)證JWT
我們可以在PHP中使用JWT嗎?
PHP中的JWT身份驗(yàn)證是什麼?
PHP中JWT的替代方案是什麼?
如何使用JWT保護(hù)PHP API?
首頁(yè) 後端開發(fā) php教程 JWT(JSON Web令牌)的PHP授權(quán)

JWT(JSON Web令牌)的PHP授權(quán)

Feb 08, 2025 am 09:57 AM

PHP Authorization with JWT (JSON Web Tokens)

應(yīng)用程序身份驗(yàn)證曾經(jīng)只依賴於用戶名/郵箱和密碼等憑據(jù),會(huì)話用於維護(hù)用戶狀態(tài)直至用戶註銷。之後,我們開始使用身份驗(yàn)證API。最近,JSON Web Tokens (JWT) 越來(lái)越多地用於對(duì)服務(wù)器請(qǐng)求進(jìn)行身份驗(yàn)證。

本文將介紹JWT是什麼以及如何使用PHP進(jìn)行基於JWT的用戶請(qǐng)求身份驗(yàn)證。

要點(diǎn)

  1. 身份驗(yàn)證方法的演變: 本文概述了用戶身份驗(yàn)證方法的演變,從傳統(tǒng)的會(huì)話到使用JSON Web Tokens (JWT),突出了向更安全、更高效的Web應(yīng)用程序用戶身份驗(yàn)證和會(huì)話管理方式的轉(zhuǎn)變。
  2. JWT的優(yōu)勢(shì)和應(yīng)用: 本文解釋了JWT相對(duì)於其他身份驗(yàn)證方法的優(yōu)勢(shì),例如存儲(chǔ)信息和元數(shù)據(jù)的能力、與OAUTH2的兼容性以及過(guò)期控制的提供,說(shuō)明了JWT如何增強(qiáng)用戶身份驗(yàn)證過(guò)程的安全性與靈活性。
  3. PHP中的實(shí)際應(yīng)用: 本文提供了在基於PHP的應(yīng)用程序中實(shí)現(xiàn)JWT的綜合指南,涵蓋了JWT的生成、使用和驗(yàn)證。其中包括詳細(xì)的代碼示例和解釋,為讀者提供了一個(gè)在自己的Web項(xiàng)目中集成基於JWT的身份驗(yàn)證的清晰路線圖。

JWT與會(huì)話

首先,為什麼會(huì)話不是那麼好呢?主要有三個(gè)原因:

  • 數(shù)據(jù)以明文形式存儲(chǔ)在服務(wù)器上。即使數(shù)據(jù)通常不存儲(chǔ)在公共文件夾中,任何擁有足夠服務(wù)器訪問(wèn)權(quán)限的人都可以讀取會(huì)話文件的內(nèi)容。
  • 它們涉及文件系統(tǒng)讀/寫請(qǐng)求。每次會(huì)話啟動(dòng)或其數(shù)據(jù)被修改時(shí),服務(wù)器都需要更新會(huì)話文件。每次應(yīng)用程序發(fā)送會(huì)話cookie時(shí)也是如此。如果用戶數(shù)量很多,最終可能會(huì)導(dǎo)致服務(wù)器速度變慢,除非您使用備用的會(huì)話存儲(chǔ)選項(xiàng),例如Memcached和Redis。
  • 分佈式/集群式應(yīng)用程序。由於會(huì)話文件默認(rèn)存儲(chǔ)在文件系統(tǒng)上,因此很難為高可用性應(yīng)用程序(需要使用負(fù)載均衡器和集群服務(wù)器等技術(shù))構(gòu)建分佈式或集群式基礎(chǔ)架構(gòu)。必須實(shí)現(xiàn)其他存儲(chǔ)介質(zhì)和特殊配置,並且必須充分了解其含義。

JWT

現(xiàn)在,讓我們開始學(xué)習(xí)JWT。 JSON Web Token規(guī)範(fàn)(RFC 7519)於2010年12月28日首次發(fā)布,最近一次更新是在2015年5月。

JWT比API密鑰具有許多優(yōu)勢(shì),包括:

  • API密鑰是隨機(jī)字符串,而JWT包含信息和元數(shù)據(jù)。這些信息和元數(shù)據(jù)可以描述各種內(nèi)容,例如用戶的身份、授權(quán)數(shù)據(jù)以及令牌在時(shí)間範(fàn)圍或相對(duì)於域的有效性。
  • JWT不需要集中的頒發(fā)或撤銷機(jī)構(gòu)。
  • JWT與OAUTH2兼容。
  • JWT數(shù)據(jù)可以被檢查。
  • JWT具有過(guò)期控制。
  • JWT適用於空間受限的環(huán)境,例如HTTP Authorization標(biāo)頭。
  • 數(shù)據(jù)以JavaScript對(duì)象表示法(JSON)格式傳輸。
  • JWT使用Base64url編碼表示。

JWT長(zhǎng)什麼樣?

這是一個(gè)JWT示例:

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>

乍一看,這個(gè)字符串似乎只是用句點(diǎn)或點(diǎn)字符連接的隨機(jī)字符組。因此,它似乎與API密鑰沒有什麼不同。但是,如果您仔細(xì)觀察,就會(huì)發(fā)現(xiàn)有三個(gè)單獨(dú)的字符串。

JWT標(biāo)頭

第一個(gè)字符串是JWT標(biāo)頭。它是一個(gè)Base64 URL編碼的JSON字符串。它指定了用於生成簽名的加密算法以及令牌的類型,該類型始終設(shè)置為JWT。該算法可以是對(duì)稱的或非對(duì)稱的。

對(duì)稱算法使用單個(gè)密鑰來(lái)創(chuàng)建和驗(yàn)證令牌。該密鑰在JWT的創(chuàng)建者和使用者之間共享。務(wù)必確保只有創(chuàng)建者和使用者知道密鑰。否則,任何人都可以創(chuàng)建有效的令牌。

非對(duì)稱算法使用私鑰來(lái)簽署令牌,並使用公鑰來(lái)驗(yàn)證令牌。當(dāng)共享密鑰不切實(shí)際或其他方只需要驗(yàn)證令牌的完整性時(shí),應(yīng)使用這些算法。

JWT的有效負(fù)載

第二個(gè)字符串是JWT的有效負(fù)載。它也是一個(gè)Base64 URL編碼的JSON字符串。它包含一些標(biāo)準(zhǔn)字段,稱為“聲明”。聲明有三種類型:註冊(cè)的公共的私有的。

註冊(cè)的聲明是預(yù)定義的。您可以在JWT的RFC中找到它們的列表。以下是一些常用的聲明:

  • iat:令牌頒發(fā)的日期時(shí)間戳。
  • key:一個(gè)唯一的字符串,可用於驗(yàn)證令牌,但這與沒有集中的頒發(fā)者機(jī)構(gòu)相悖。
  • iss:包含頒發(fā)者名稱或標(biāo)識(shí)符的字符串。可以是域名,可用於丟棄來(lái)自其他應(yīng)用程序的令牌。
  • nbf:令牌應(yīng)開始被視為有效的日期時(shí)間戳。應(yīng)等於或大於iat。
  • exp:令牌應(yīng)停止有效的日期時(shí)間戳。應(yīng)大於iat和nbf。

您可以根據(jù)需要定義公共聲明。但是,它們不能與註冊(cè)的聲明或已存在的公共聲明的聲明相同。您可以隨意創(chuàng)建私有聲明。它們僅供雙方使用:生產(chǎn)者和消費(fèi)者。

JWT的簽名

JWT的簽名是一種加密機(jī)制,旨在使用對(duì)令牌內(nèi)容唯一的數(shù)字簽名來(lái)保護(hù)JWT的數(shù)據(jù)。簽名確保JWT的完整性,以便使用者可以驗(yàn)證它沒有被惡意行為者篡改。

JWT的簽名是三件事的組合:

  • JWT的標(biāo)頭
  • JWT的有效負(fù)載
  • 一個(gè)秘密值

這三者使用JWT標(biāo)頭中指定的算法進(jìn)行數(shù)字簽名(未加密)。如果我們解碼上面的示例,我們將得到以下JSON字符串:

JWT的標(biāo)頭

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>

JWT的數(shù)據(jù)

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>

您可以自己嘗試jwt.io,在那裡您可以嘗試編碼和解碼您自己的JWT。

在基於PHP的應(yīng)用程序中使用JWT

既然您已經(jīng)了解了JWT是什麼,那麼現(xiàn)在是時(shí)候?qū)W習(xí)如何在PHP應(yīng)用程序中使用它們了。在深入研究之前,您可以隨意克隆本文的代碼,或者按照我們的步驟進(jìn)行操作。

您可以採(cǎi)用多種方法來(lái)集成JWT,但以下是我們將要採(cǎi)用的方法。

除登錄和註銷頁(yè)面外,對(duì)應(yīng)用程序的所有請(qǐng)求都需要通過(guò)JWT進(jìn)行身份驗(yàn)證。如果用戶在沒有JWT的情況下發(fā)出請(qǐng)求,他們將被重定向到登錄頁(yè)面。

用戶填寫並提交登錄表單後,表單將通過(guò)JavaScript提交到我們應(yīng)用程序中的登錄端點(diǎn)authenticate.php。然後,端點(diǎn)將從請(qǐng)求中提取憑據(jù)(用戶名和密碼),並檢查它們是否有效。

如果有效,它將生成一個(gè)JWT並將其發(fā)送回客戶端。當(dāng)客戶端收到JWT時(shí),它將存儲(chǔ)JWT並將其用於對(duì)應(yīng)用程序的未來(lái)每次請(qǐng)求。

對(duì)於一個(gè)簡(jiǎn)單的場(chǎng)景,用戶只能請(qǐng)求一個(gè)資源——一個(gè)恰當(dāng)命名的PHP文件resource.php。它不會(huì)做太多事情,只是返回一個(gè)包含請(qǐng)求時(shí)當(dāng)前時(shí)間戳的字符串。

在發(fā)出請(qǐng)求時(shí),可以使用多種方法來(lái)使用JWT。在我們的應(yīng)用程序中,JWT將發(fā)送在Bearer授權(quán)標(biāo)頭中。

如果您不熟悉Bearer Authorization,它是一種HTTP身份驗(yàn)證形式,其中令牌(例如JWT)發(fā)送在請(qǐng)求標(biāo)頭中。服務(wù)器可以檢查令牌並確定是否應(yīng)授予令牌的“持有者”訪問(wèn)權(quán)限。

這是一個(gè)標(biāo)頭的示例:

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>

對(duì)於我們的應(yīng)用程序收到的每個(gè)請(qǐng)求,PHP都將嘗試從Bearer標(biāo)頭中提取令牌。如果存在,則對(duì)其進(jìn)行驗(yàn)證。如果有效,用戶將看到該請(qǐng)求的正常響應(yīng)。但是,如果JWT無(wú)效,則不允許用戶訪問(wèn)資源。

請(qǐng)注意,JWT並非旨在替代會(huì)話cookie。

先決條件

首先,我們需要在我們的系統(tǒng)上安裝PHP和Composer。

在項(xiàng)目的根目錄中,運(yùn)行composer install。這將引入Firebase PHP-JWT,這是一個(gè)簡(jiǎn)化JWT操作的第三方庫(kù),以及用於簡(jiǎn)化應(yīng)用程序中對(duì)配置數(shù)據(jù)訪問(wèn)的laminas-config。

登錄表單

圖片

安裝庫(kù)後,讓我們逐步完成authenticate.php中的登錄代碼。我們首先進(jìn)行通常的設(shè)置,確保Composer生成的自動(dòng)加載器可用。

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>

收到表單提交後,憑據(jù)將針對(duì)數(shù)據(jù)庫(kù)或其他一些數(shù)據(jù)存儲(chǔ)進(jìn)行驗(yàn)證。出於本示例的目的,我們將假設(shè)它們有效,並將$hasValidCredentials設(shè)置為true。

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>

接下來(lái),我們初始化一組變量,用於生成JWT。請(qǐng)記住,由於JWT可以在客戶端進(jìn)行檢查,因此不要在其中包含任何敏感信息。

另一件值得指出的是,$secretKey不會(huì)像這樣初始化。您可能會(huì)在環(huán)境中設(shè)置它並提取它,使用phpdotenv等庫(kù),或在配置文件中設(shè)置它。在本例中,我避免這樣做,因?yàn)槲蚁腙P(guān)注JWT代碼。

切勿洩露它或?qū)⑵浯鎯?chǔ)在版本控制下!

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>

準(zhǔn)備好有效負(fù)載數(shù)據(jù)後,我們接下來(lái)使用php-jwt的靜態(tài)encode方法來(lái)創(chuàng)建JWT。

該方法:

  • 將數(shù)組轉(zhuǎn)換為JSON
  • 生成標(biāo)頭
  • 簽署有效負(fù)載
  • 編碼最終字符串

它接受三個(gè)參數(shù):

  • 有效負(fù)載信息
  • 密鑰
  • 用於簽署令牌的算法

通過(guò)對(duì)函數(shù)結(jié)果調(diào)用echo,返回生成的令牌:

<code>Authorization: Bearer ab0dde18155a43ee83edba4a4542b973</code>

使用JWT

圖片

現(xiàn)在客戶端有了令牌,您可以使用JavaScript或您喜歡的任何機(jī)制來(lái)存儲(chǔ)它。以下是如何使用原生JavaScript進(jìn)行操作的示例。在index.html中,成功提交表單後,收到的JWT將存儲(chǔ)在內(nèi)存中,登錄表單將被隱藏,並且將顯示請(qǐng)求時(shí)間戳的按鈕:

<?php
declare(strict_types=1);

use Firebase\JWT\JWT;

require_once('../vendor/autoload.php');

使用JWT

單擊“獲取當(dāng)前時(shí)間戳”按鈕時(shí),將向resource.php發(fā)出GET請(qǐng)求,該請(qǐng)求在Authorization標(biāo)頭中設(shè)置身份驗(yàn)證後收到的JWT。

<?php
// 從請(qǐng)求中提取憑據(jù)

if ($hasValidCredentials) {

當(dāng)我們單擊按鈕時(shí),將發(fā)出類似於以下內(nèi)容的請(qǐng)求:

$secretKey  = 'bGS6lzFqvvSQ8ALbOxatm7/Vk7mLQyzqaS34Q4oR1ew=';
$issuedAt   = new DateTimeImmutable();
$expire     = $issuedAt->modify('+6 minutes')->getTimestamp();      // 添加60秒
$serverName = "your.domain.name";
$username   = "username";                                           // 從過(guò)濾后的POST數(shù)據(jù)中檢索

$data = [
    'iat'  => $issuedAt->getTimestamp(),         // 頒發(fā)時(shí)間:生成令牌的時(shí)間
    'iss'  => $serverName,                       // 頒發(fā)者
    'nbf'  => $issuedAt->getTimestamp(),         // 不早于
    'exp'  => $expire,                           // 過(guò)期
    'userName' => $username,                     // 用戶名
];

假設(shè)JWT有效,我們將看到資源,之後響應(yīng)將寫入控制臺(tái)。

驗(yàn)證JWT

最後,讓我們看看如何在PHP中驗(yàn)證令牌。與往常一樣,我們將包含Composer的自動(dòng)加載器。然後,我們可以選擇檢查是否使用了正確的請(qǐng)求方法。為了繼續(xù)關(guān)注JWT特定的代碼,我已經(jīng)跳過(guò)了執(zhí)行此操作的代碼:

<?php     // 將數(shù)組編碼為JWT字符串。
    echo JWT::encode(
        $data,
        $secretKey,
        'HS512'
    );
}

然後,代碼將嘗試從Bearer標(biāo)頭中提取令牌。我已經(jīng)使用preg_match這樣做了。如果您不熟悉該函數(shù),它將在字符串上執(zhí)行正則表達(dá)式匹配。

我在這裡使用的正則表達(dá)式將嘗試從Bearer標(biāo)頭中提取令牌,並轉(zhuǎn)儲(chǔ)其他所有內(nèi)容。如果找不到,則返回HTTP 400錯(cuò)誤請(qǐng)求:

const store = {};
const loginButton = document.querySelector('#frmLogin');
const btnGetResource = document.querySelector('#btnGetResource');
const form = document.forms[0];

// 將jwt插入到store對(duì)象中
store.setJWT = function (data) {
  this.JWT = data;
};

loginButton.addEventListener('submit', async (e) => {
  e.preventDefault();

  const res = await fetch('/authenticate.php', {
    method: 'POST',
    headers: {
      'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body: JSON.stringify({
      username: form.inputEmail.value,
      password: form.inputPassword.value
    })
  });

  if (res.status >= 200 && res.status < 300) {
    const jwt = await res.text();
    store.setJWT(jwt);
    frmLogin.style.display = 'none';
    btnGetResource.style.display = 'block';
  } else {
    // 處理錯(cuò)誤
    console.log(res.status, res.statusText);
  }
});

請(qǐng)注意,默認(rèn)情況下,Apache不會(huì)將HTTP_AUTHORIZATION標(biāo)頭傳遞給PHP。其背後的原因是:

基本授權(quán)標(biāo)頭只有在您的連接通過(guò)HTTPS完成時(shí)才安全,因?yàn)榉駝t憑據(jù)將以編碼的明文(未加密)形式通過(guò)網(wǎng)絡(luò)發(fā)送,這是一個(gè)巨大的安全問(wèn)題。

我完全理解這一決定的邏輯。但是,為了避免很多混淆,請(qǐng)將以下內(nèi)容添加到您的Apache配置中。然後代碼將按預(yù)期工作。如果您使用的是NGINX,則代碼應(yīng)該按預(yù)期工作:

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>

接下來(lái),我們嘗試提取匹配的JWT,它將位於$matches變量的第二個(gè)元素中。如果不可用,則沒有提取JWT,並返回HTTP 400錯(cuò)誤請(qǐng)求:

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>

如果我們到達(dá)此點(diǎn),則提取JWT,因此我們轉(zhuǎn)到解碼和驗(yàn)證階段。為此,我們?cè)俅涡枰覀兊拿荑€,它將從環(huán)境或應(yīng)用程序的配置中提取。然後,我們使用php-jwt的靜態(tài)decode方法,將JWT、密鑰和一組用於解碼JWT的算法傳遞給它。

如果能夠成功解碼,我們就會(huì)嘗試驗(yàn)證它。我這裡的示例非常簡(jiǎn)單,因?yàn)樗皇褂妙C發(fā)者、不早於和過(guò)期時(shí)間戳。在實(shí)際應(yīng)用程序中,您可能還會(huì)使用許多其他聲明。

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>

如果令牌無(wú)效,例如令牌已過(guò)期,則用戶將收到HTTP 401未授權(quán)標(biāo)頭,並且腳本將退出。

如果解碼和驗(yàn)證過(guò)程失敗,則可能是:

  • 提供的段數(shù)與前面描述的標(biāo)準(zhǔn)三個(gè)段數(shù)不匹配。
  • 標(biāo)頭或有效負(fù)載不是有效的JSON字符串。
  • 簽名無(wú)效,這意味著數(shù)據(jù)已被篡改!
  • JWT中設(shè)置了nbf聲明,其時(shí)間戳小於當(dāng)前時(shí)間戳。
  • JWT中設(shè)置了iat聲明,其時(shí)間戳小於當(dāng)前時(shí)間戳。
  • JWT中設(shè)置了exp聲明,其時(shí)間戳大於當(dāng)前時(shí)間戳。

如您所見,JWT具有一套不錯(cuò)的控制措施,無(wú)需手動(dòng)撤銷或針對(duì)有效令牌列表進(jìn)行檢查即可將其標(biāo)記為無(wú)效。

如果解碼和驗(yàn)證過(guò)程成功,則用戶將被允許發(fā)出請(qǐng)求,並將收到相應(yīng)的響應(yīng)。

總結(jié)

這是一個(gè)關(guān)於JSON Web Tokens(或JWT)以及如何在基於PHP的應(yīng)用程序中使用它們的快速介紹。從這裡開始,您可以嘗試在下一個(gè)API中實(shí)現(xiàn)JWT,也許嘗試一些使用非對(duì)稱密鑰(如RS256)的其他簽名算法,或者將其集成到現(xiàn)有的OAUTH2身份驗(yàn)證服務(wù)器中以用作API密鑰。

如果您有任何意見或問(wèn)題,請(qǐng)隨時(shí)通過(guò)Twitter與我們聯(lián)繫。

關(guān)於使用JWT進(jìn)行PHP授權(quán)的常見問(wèn)題解答

我們可以在PHP中使用JWT嗎?

您確實(shí)可以在PHP中使用JWT來(lái)在Web應(yīng)用程序中建立身份驗(yàn)證和授權(quán)機(jī)制。要開始使用,您需要使用Composer安裝PHP JWT庫(kù),例如“firebase/php-jwt”或“l(fā)cobucci/jwt”。這些庫(kù)提供了創(chuàng)建、編碼、解碼和驗(yàn)證JWT的必要工具。 要?jiǎng)?chuàng)建JWT,您可以使用庫(kù)來(lái)構(gòu)建包含發(fā)行者、受眾、過(guò)期時(shí)間等聲明的令牌。創(chuàng)建後,您可以使用密鑰簽署令牌。接收J(rèn)WT時(shí),您可以使用庫(kù)對(duì)其進(jìn)行解碼和驗(yàn)證以確保其真實(shí)性。如果令牌有效且已驗(yàn)證,您可以訪問(wèn)其聲明以確定用戶身份和權(quán)限,從而允許您在PHP應(yīng)用程序中實(shí)現(xiàn)安全的身份驗(yàn)證和授權(quán)。 保護(hù)密鑰並遵循使用JWT時(shí)的安全最佳實(shí)踐對(duì)於防止未經(jīng)授權(quán)訪問(wèn)應(yīng)用程序資源至關(guān)重要。

PHP中的JWT身份驗(yàn)證是什麼?

PHP中的JWT(JSON Web Token)身份驗(yàn)證是一種廣泛用於在Web應(yīng)用程序中實(shí)現(xiàn)用戶身份驗(yàn)證和授權(quán)的方法。它基於令牌的身份驗(yàn)證,能夠進(jìn)行安全且無(wú)狀態(tài)的用戶驗(yàn)證。以下是JWT身份驗(yàn)證在PHP中的工作方式: 首先,在用戶身份驗(yàn)證或登錄期間,服務(wù)器會(huì)生成一個(gè)JWT,這是一個(gè)緊湊的、自包含的令牌,其中包含與用戶相關(guān)的信息(聲明),例如用戶ID、用戶名和角色。這些聲明通常是JSON數(shù)據(jù)。然後,服務(wù)器使用密鑰簽署此令牌以確保其完整性和真實(shí)性。 其次,成功進(jìn)行身份驗(yàn)證後,服務(wù)器會(huì)將JWT發(fā)送回客戶端,客戶端通常將其存儲(chǔ)在安全位置,例如HTTP cookie或本地存儲(chǔ)。此令牌作為身份驗(yàn)證的證明。 最後,對(duì)於對(duì)服務(wù)器上受保護(hù)資源的後續(xù)請(qǐng)求,客戶端會(huì)在請(qǐng)求標(biāo)頭中附加JWT,通常使用帶有“Bearer”方案的“Authorization”標(biāo)頭。服務(wù)器收到JWT後,會(huì)使用在令牌創(chuàng)建期間使用的相同密鑰來(lái)驗(yàn)證其簽名。此外,它還會(huì)檢查令牌是否未過(guò)期且包含有效的聲明。成功驗(yàn)證後,它會(huì)從令牌聲明中提取用戶信息,並實(shí)現(xiàn)授權(quán)邏輯以確保用戶具有訪問(wèn)請(qǐng)求資源所需的權(quán)限。這種方法允許在PHP應(yīng)用程序中進(jìn)行安全、無(wú)狀態(tài)的身份驗(yàn)證,而無(wú)需服務(wù)器端會(huì)話存儲(chǔ)。 雖然PHP中的JWT身份驗(yàn)證提供了許多好處,例如可擴(kuò)展性和無(wú)狀態(tài)性,但保護(hù)密鑰並採(cǎi)用令牌管理的最佳實(shí)踐對(duì)於維護(hù)應(yīng)用程序的安全至關(guān)重要。使用已建立的PHP JWT庫(kù)可以簡(jiǎn)化令牌處理並增強(qiáng)安全性。

PHP中JWT的替代方案是什麼?

PHP中用於身份驗(yàn)證和授權(quán)的JWT(JSON Web Tokens)的替代方案是基於會(huì)話的身份驗(yàn)證。在基於會(huì)話的身份驗(yàn)證中,服務(wù)器為每個(gè)已驗(yàn)證的用戶維護(hù)一個(gè)會(huì)話。當(dāng)用戶登錄時(shí),會(huì)創(chuàng)建一個(gè)唯一的會(huì)話標(biāo)識(shí)符(通常存儲(chǔ)為客戶端瀏覽器上的會(huì)話cookie)。此標(biāo)識(shí)符用於將用戶與服務(wù)器端會(huì)話數(shù)據(jù)關(guān)聯(lián)起來(lái),包括與用戶相關(guān)的信息,例如用戶ID、用戶名和權(quán)限。 基於會(huì)話的身份驗(yàn)證提供簡(jiǎn)單性和易於實(shí)現(xiàn),使其適用於各種Web應(yīng)用程序,尤其是在您不需要JWT的無(wú)狀態(tài)性和可擴(kuò)展性功能時(shí)。它本質(zhì)上是有狀態(tài)的,當(dāng)您需要在用戶會(huì)話期間管理特定於用戶的數(shù)據(jù)(例如購(gòu)物車內(nèi)容或用戶首選項(xiàng))時(shí),這可能是有利的。 但是,使用基於會(huì)話的身份驗(yàn)證時(shí),需要考慮一些事項(xiàng)。對(duì)於需要無(wú)狀態(tài)身份驗(yàn)證的分佈式或基於微服務(wù)的架構(gòu),它可能不太適用。此外,管理用戶會(huì)話可能會(huì)增加服務(wù)器負(fù)載,尤其是在用戶群較大的應(yīng)用程序中。最終,在PHP中選擇JWT和基於會(huì)話的身份驗(yàn)證應(yīng)與應(yīng)用程序的特定需求和設(shè)計(jì)考慮因素相符,確保安全有效的身份驗(yàn)證機(jī)制最能滿足您的需求。

如何使用JWT保護(hù)PHP API?

使用JWT(JSON Web Tokens)保護(hù)PHP API涉及一個(gè)多步驟過(guò)程,該過(guò)程結(jié)合了身份驗(yàn)證和授權(quán)。首先,選擇合適的PHP JWT庫(kù)(如“firebase/php-jwt”或“l(fā)cobucci/jwt”)來(lái)處理與令牌相關(guān)的操作,並使用Composer管理依賴項(xiàng)。 對(duì)於身份驗(yàn)證,您需要在PHP應(yīng)用程序中實(shí)現(xiàn)用戶身份驗(yàn)證系統(tǒng)。此系統(tǒng)會(huì)針對(duì)您的數(shù)據(jù)庫(kù)或身份驗(yàn)證提供程序驗(yàn)證用戶憑據(jù)。成功進(jìn)行身份驗(yàn)證後,您將生成一個(gè)JWT令牌,其中包含與用戶相關(guān)的聲明,例如用戶的ID、用戶名和角色。務(wù)必設(shè)置過(guò)期時(shí)間以控制令牌的有效性,然後使用密鑰簽署令牌。此已簽名的令牌作為身份驗(yàn)證響應(yīng)的一部分發(fā)送回客戶端。 客戶端安全地存儲(chǔ)收到的JWT,通常存儲(chǔ)在HTTP cookie或本地存儲(chǔ)中。對(duì)於後續(xù)的API請(qǐng)求,客戶端會(huì)在請(qǐng)求標(biāo)頭中包含JWT,作為帶有“Bearer”方案的“Authorization”標(biāo)頭。在您的PHP API中,您可以通過(guò)使用創(chuàng)建令牌時(shí)使用的相同密鑰來(lái)驗(yàn)證其簽名來(lái)驗(yàn)證傳入的JWT。此外,您還會(huì)檢查令牌是否未過(guò)期且包含有效的聲明。成功驗(yàn)證後,您將從令牌聲明中提取用戶信息,並實(shí)現(xiàn)授權(quán)邏輯以確保用戶具有訪問(wèn)請(qǐng)求資源所需的權(quán)限。 保持密鑰安全至關(guān)重要,因?yàn)樗鼘?duì)於簽署和驗(yàn)證令牌都至關(guān)重要。此密鑰的任何洩露都可能導(dǎo)致嚴(yán)重的安全性漏洞。

以上是JWT(JSON Web令牌)的PHP授權(quán)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗(yàn)證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲(chǔ)至非Web根目錄;3.通過(guò)php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過(guò)程安全可靠。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場(chǎng)景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號(hào),支持整數(shù)和浮點(diǎn)數(shù),也可用於變量,字符串?dāng)?shù)字會(huì)自動(dòng)轉(zhuǎn)換但不推薦依賴;2.減法用-號(hào),變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號(hào),適用於數(shù)字及類似字符串;4.除法用/號(hào),需避免除以零,並註意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號(hào),可用於判斷奇偶數(shù),處理負(fù)數(shù)時(shí)餘數(shù)符號(hào)與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過(guò)特定擴(kuò)展或庫(kù)與MongoDB和Redis等NoSQL數(shù)據(jù)庫(kù)交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過(guò)PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫(kù)及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫(kù)或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場(chǎng)景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles