国产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?
首頁 後端開發(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ù),會話用於維護(hù)用戶狀態(tài)直至用戶註銷。之後,我們開始使用身份驗(yàn)證API。最近,JSON Web Tokens (JWT) 越來越多地用於對服務(wù)器請求進(jìn)行身份驗(yàn)證。

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

要點(diǎn)

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

JWT與會話

首先,為什麼會話不是那麼好呢?主要有三個原因:

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

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

JWT長什麼樣?

這是一個JWT示例:

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

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

JWT標(biāo)頭

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

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

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

JWT的有效負(fù)載

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

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

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

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

JWT的簽名

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

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

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

這三者使用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)在是時候?qū)W習(xí)如何在PHP應(yīng)用程序中使用它們了。在深入研究之前,您可以隨意克隆本文的代碼,或者按照我們的步驟進(jìn)行操作。

您可以採用多種方法來集成JWT,但以下是我們將要採用的方法。

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

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

如果有效,它將生成一個JWT並將其發(fā)送回客戶端。當(dāng)客戶端收到JWT時,它將存儲JWT並將其用於對應(yīng)用程序的未來每次請求。

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

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

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

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

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

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

請注意,JWT並非旨在替代會話cookie。

先決條件

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

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

登錄表單

圖片

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

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

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

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

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

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

切勿洩露它或?qū)⑵浯鎯υ诎姹究刂葡拢?

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

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

該方法:

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

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

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

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

<code>Authorization: Bearer ab0dde18155a43ee83edba4a4542b973</code>

使用JWT

圖片

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

<?php
declare(strict_types=1);

use Firebase\JWT\JWT;

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

使用JWT

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

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

if ($hasValidCredentials) {

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

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

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

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

驗(yàn)證JWT

最後,讓我們看看如何在PHP中驗(yàn)證令牌。與往常一樣,我們將包含Composer的自動加載器。然後,我們可以選擇檢查是否使用了正確的請求方法。為了繼續(xù)關(guān)注JWT特定的代碼,我已經(jīng)跳過了執(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)儲其他所有內(nèi)容。如果找不到,則返回HTTP 400錯誤請求:

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

// 將jwt插入到store對象中
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 {
    // 處理錯誤
    console.log(res.status, res.statusText);
  }
});

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

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

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

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

接下來,我們嘗試提取匹配的JWT,它將位於$matches變量的第二個元素中。如果不可用,則沒有提取JWT,並返回HTTP 400錯誤請求:

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

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

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

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

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

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

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

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

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

總結(jié)

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

如果您有任何意見或問題,請隨時通過Twitter與我們聯(lián)繫。

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

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

您確實(shí)可以在PHP中使用JWT來在Web應(yīng)用程序中建立身份驗(yàn)證和授權(quán)機(jī)制。要開始使用,您需要使用Composer安裝PHP JWT庫,例如“firebase/php-jwt”或“l(fā)cobucci/jwt”。這些庫提供了創(chuàng)建、編碼、解碼和驗(yàn)證JWT的必要工具。 要創(chuàng)建JWT,您可以使用庫來構(gòu)建包含發(fā)行者、受眾、過期時間等聲明的令牌。創(chuàng)建後,您可以使用密鑰簽署令牌。接收J(rèn)WT時,您可以使用庫對其進(jìn)行解碼和驗(yàn)證以確保其真實(shí)性。如果令牌有效且已驗(yàn)證,您可以訪問其聲明以確定用戶身份和權(quán)限,從而允許您在PHP應(yīng)用程序中實(shí)現(xiàn)安全的身份驗(yàn)證和授權(quán)。 保護(hù)密鑰並遵循使用JWT時的安全最佳實(shí)踐對於防止未經(jīng)授權(quá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)行安全且無狀態(tài)的用戶驗(yàn)證。以下是JWT身份驗(yàn)證在PHP中的工作方式: 首先,在用戶身份驗(yàn)證或登錄期間,服務(wù)器會生成一個JWT,這是一個緊湊的、自包含的令牌,其中包含與用戶相關(guān)的信息(聲明),例如用戶ID、用戶名和角色。這些聲明通常是JSON數(shù)據(jù)。然後,服務(wù)器使用密鑰簽署此令牌以確保其完整性和真實(shí)性。 其次,成功進(jìn)行身份驗(yàn)證後,服務(wù)器會將JWT發(fā)送回客戶端,客戶端通常將其存儲在安全位置,例如HTTP cookie或本地存儲。此令牌作為身份驗(yàn)證的證明。 最後,對於對服務(wù)器上受保護(hù)資源的後續(xù)請求,客戶端會在請求標(biāo)頭中附加JWT,通常使用帶有“Bearer”方案的“Authorization”標(biāo)頭。服務(wù)器收到JWT後,會使用在令牌創(chuàng)建期間使用的相同密鑰來驗(yàn)證其簽名。此外,它還會檢查令牌是否未過期且包含有效的聲明。成功驗(yàn)證後,它會從令牌聲明中提取用戶信息,並實(shí)現(xiàn)授權(quán)邏輯以確保用戶具有訪問請求資源所需的權(quán)限。這種方法允許在PHP應(yīng)用程序中進(jìn)行安全、無狀態(tài)的身份驗(yàn)證,而無需服務(wù)器端會話存儲。 雖然PHP中的JWT身份驗(yàn)證提供了許多好處,例如可擴(kuò)展性和無狀態(tài)性,但保護(hù)密鑰並採用令牌管理的最佳實(shí)踐對於維護(hù)應(yīng)用程序的安全至關(guān)重要。使用已建立的PHP JWT庫可以簡化令牌處理並增強(qiáng)安全性。

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

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(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)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(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ī)文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

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

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

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

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

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

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場景,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時區(qū)? 如何設(shè)置PHP時區(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