PHP JWT即JSON Web Token,是一個(gè)開放的行業(yè)標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用之間安全地傳遞聲明。JWT是一種基于 JSON 的開放標(biāo)準(zhǔn),可以被定義為一種基于令牌的認(rèn)證協(xié)議,用于身份驗(yàn)證和授權(quán)。JWT通過在各個(gè)設(shè)備之間傳輸令牌來簡(jiǎn)化開發(fā)人員處理用戶身份驗(yàn)證的復(fù)雜性。在PHP中,JWT可以通過第三方類庫(kù)來實(shí)現(xiàn)。
PHP JWT版本有很多,比如firebase/php-jwt、tymon/jwt-auth、lcobucci/jwt等等。下面以lcobucci/jwt為例進(jìn)行講解。
首先,需要安裝lcobucci/jwt類庫(kù)。可以使用Composer進(jìn)行安裝。
composer require lcobucci/jwt
然后,在代碼中引入使用:
use Lcobucci\JWT\Builder; use Lcobucci\JWT\Signer\Hmac\Sha256; $signer = new Sha256(); $token = (new Builder())->setIssuer('http://example.com') // 設(shè)置簽發(fā)人 ->setAudience('http://example.org') // 設(shè)置接收人 ->setId('4f1g23a12aa', true) // 設(shè)置id ->setIssuedAt(time()) // 設(shè)置簽發(fā)時(shí)間 ->setExpiration(time() + 3600) // 設(shè)置過期時(shí)間 ->set('uid', 1) // 設(shè)置用戶信息 ->sign($signer, 'shared-secret') // 使用共享秘密簽名 ->getToken(); // 獲取token
上面的代碼使用Hmac SHA256算法對(duì)token進(jìn)行簽名,同時(shí)設(shè)置了簽發(fā)人、接收人、id、過期時(shí)間等信息,并在其中添加了一個(gè)鍵值對(duì),表示用戶信息。
在另一個(gè)設(shè)備上,接收到token后可以進(jìn)行驗(yàn)證、獲取信息:
use Lcobucci\JWT\Parser; use Lcobucci\JWT\ValidationData; $token = (new Parser())->parse(getTokenFromRequest()); $validationData = new ValidationData(); $validationData->setIssuer('http://example.com'); $validationData->setAudience('http://example.org'); $validationData->setId('4f1g23a12aa'); if ($token->validate($validationData)) { $uid = $token->getClaim('uid'); echo '用戶id: ' . $uid; } else { echo 'token驗(yàn)證失敗'; }
上面的代碼首先使用Parser解析token,然后創(chuàng)建了一個(gè)ValidationData對(duì)象,設(shè)置了簽發(fā)人、接收人、id等信息,以確保token是合法的。如果驗(yàn)證通過,就可以從token中獲取uid信息并使用。
除了基本的簽名和驗(yàn)證,JWT還支持密鑰對(duì)簽名、刷新token等功能,可以根據(jù)具體需求進(jìn)行選擇。
總之,PHP JWT是一種非常方便、安全的身份認(rèn)證協(xié)議,能夠極大地簡(jiǎn)化應(yīng)用開發(fā)和用戶驗(yàn)證的流程。