隨著互聯(lián)網(wǎng)的發(fā)展,Web應(yīng)用的用戶量逐漸增多,安全問題也成為了越來越重要的問題。身份驗(yàn)證是Web應(yīng)用安全的重要組成部分,因?yàn)橹挥薪?jīng)過身份驗(yàn)證的用戶才能訪問需要權(quán)限的資源。
JSON Web Token (JWT) 是一種輕便、自包含的認(rèn)證 token,是在 Web 應(yīng)用間安全地傳輸信息的好方法。JWT 認(rèn)證方案適用于分布式系統(tǒng)和單頁應(yīng)用。
ThinkPHP是一個(gè)流行的PHP框架,它提供了許多工具來開發(fā)安全的Web應(yīng)用程序。在本文中,我們將介紹如何在ThinkPHP6中使用JWT進(jìn)行身份驗(yàn)證以增強(qiáng)應(yīng)用程序的安全性。
開發(fā)環(huán)境和依賴
在開始之前,我們需要確保開發(fā)環(huán)境已經(jīng)正確設(shè)置。以下是本文所使用的環(huán)境和依賴。請根據(jù)您的需求進(jìn)行相應(yīng)地更改。
PHP 7.2 或更高版本ThinkPHP 6.0.0 或更高版本Firebase JWT PHP 庫
步驟1:安裝 Firebase JWT PHP 庫
安裝 Firebase JWT PHP 庫是使用 JWT 身份驗(yàn)證方案的第一步。該庫將幫助我們創(chuàng)建、簽名和驗(yàn)證 JWT。
我們可以使用 Composer 安裝 Firebase JWT PHP 庫。 在命令行中輸入以下命令:
composer require firebase/php-jwt
登錄后復(fù)制
步驟2:創(chuàng)建Token類
為了便于管理和使用 JWT,我們創(chuàng)建一個(gè)名為Token的類來處理 JWT 驗(yàn)證的各個(gè)方面。這個(gè)類將包括創(chuàng)建令牌,驗(yàn)證令牌,獲取令牌信息等功能。
在 app/common 目錄下創(chuàng)建 Token.php 文件,并添加以下代碼:
<?php namespace appcommon; use FirebaseJWTJWT; class Token { private static $key = 'your_secret_key'; private static $alg = 'HS256'; public static function createToken($data, $expiration = 3600) { $payload = [ 'iss' => 'localhost', 'sub' => 'token', 'iat' => time(), 'exp' => time() + $expiration, 'data' => $data ]; return JWT::encode($payload, self::$key, self::$alg); } public static function decodeToken($token) { return JWT::decode($token, self::$key, [self::$alg]); } public static function getDataByToken($token) { $decoded = self::decodeToken($token); if (isset($decoded->data)) { return $decoded->data; } else { return false; } } public static function verifyToken($token) { $result = false; try { $decoded = self::decodeToken($token); $result = true; } catch (Exception $e) { // Invalid token } return $result; } }
登錄后復(fù)制
在代碼中,我們使用FirebaseJWTJWT
庫中的encode()
和decode()
方法來創(chuàng)建和解析 JWT。$key
是我們用于簽名 JWT 的密鑰,$alg
是我們選擇的算法。 在createToken()
方法中,我們使用 JWT 負(fù)載中的四個(gè)鍵(iss,iat,exp和sub)并添加自定義data
。$expiration
參數(shù)指定 JWT 的過期時(shí)間。因此,JWT 只能在有效期內(nèi)使用。
步驟3:在中間件中驗(yàn)證令牌
現(xiàn)在我們已經(jīng)創(chuàng)建了 Token 類以處理 JWT 相關(guān)的工作,我們需要在中間件中驗(yàn)證用戶 JWT。使用中間件可以方便地在應(yīng)用程序的控制器代碼中攔截和設(shè)置響應(yīng),并且可以將代碼分離到不同的類中以便更好地管理和修改。
在 app/middleware 目錄下創(chuàng)建Jwt.php文件,并添加以下代碼:
<?php namespace appmiddleware; use appcommonToken; use thinkexceptionHttpResponseException; use thinkResponse; class Jwt { public function handle($request, Closure $next) { if (!$request->header('Authorization')) { return json(['code' => 401, 'msg' => 'Unauthorized']); } $header = $request->header('Authorization'); $token = substr($header, 7); if (Token::verifyToken($token)) { $request->data = Token::getDataByToken($token); return $next($request); } else { return json(['code' => 401, 'msg' => 'Unauthorized']); } } }
登錄后復(fù)制
在此中間件中,我們使用 Token 類中的verifyToken()
方法來驗(yàn)證 JWT。 此方法將返回 true 或 false,表示令牌是否有效。 如果有效,我們將使用getDataByToken()
方法來獲取 JWT 的數(shù)據(jù)部分并將其存儲在$request->data
中。 這樣,控制器就可以使用此數(shù)據(jù)。
步驟4:設(shè)置路由
現(xiàn)在,我們已經(jīng)創(chuàng)建了中間件,我們需要將其應(yīng)用到適當(dāng)?shù)穆酚缮稀?/p>
假設(shè)我們要保護(hù)/api/user
的路由,我們需要在routepi.php
文件中按如下方式設(shè)置路由:
use appmiddlewareJwt; Route::group('api', function() { Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class); });
登錄后復(fù)制
請注意,在此路由中,我們將Jwt
中間件作為參數(shù)傳遞給middleware()
方法。這是UserController
中的getUserInfo()
方法的示例代碼。
<?php namespace appcontroller; use appcommonToken; class UserController { public function getUserInfo() { $data = request()->data; ... } ... }
登錄后復(fù)制
在控制器中,您可以通過調(diào)用$request->data
來訪問經(jīng)過身份驗(yàn)證的 JWT 中存儲的數(shù)據(jù)。
結(jié)論
JWT 身份驗(yàn)證方法可以使您的 Web 應(yīng)用程序更安全和可靠。在本文中,我們介紹了如何在ThinkPHP6中使用 Firebase JWT PHP 庫來創(chuàng)建和驗(yàn)證 JWT。
我們創(chuàng)建了一個(gè)名為 Token 的類,該類用于處理 JWT 相關(guān)的工作,并且添加了一個(gè)用于驗(yàn)證 JWT 并設(shè)置數(shù)據(jù)的中間件。最后,我們設(shè)置了使用此中間件的路由和控制器代碼以訪問存儲在 JWT 中的數(shù)據(jù)。
引入 JWT 身份驗(yàn)證的主要目的是確保應(yīng)用程序中的資源只能被經(jīng)過身份驗(yàn)證的用戶使用。希望本文能夠幫助您了解如何使用 JWT 身份驗(yàn)證來保護(hù)您的應(yīng)用程序!
以上就是在ThinkPHP6中使用JWT驗(yàn)證的詳細(xì)內(nèi)容,更多請關(guān)注www.xfxf.net其它相關(guān)文章!