tp8.0\jwt接口安全驗證

環境:php8.3\tp8.1\firebase-jwt6.1

app\middleware\JwtAuth

<?php
namespace app\middleware;use app\common\library\JwtHandler;
use think\Request;
use think\facade\Env;class JwtAuth
{public function handle(Request $request, \Closure $next){// 獲取當前請求路徑$path = $request->pathinfo();// 如果是登錄或注冊接口,跳過 Token 校驗if (in_array($path, ['api/auth/login/', 'api/auth/register/'])) {return $next($request);}// 獲取 Authorization 頭$token = $request->header('Authorization');if (!$token) {$this->handleTokenError('Token not provided');}// 如果 Authorization 頭中有 Bearer token,處理它if (str_starts_with($token, 'Bearer ')) {$token = substr($token, 7);  // 去掉 'Bearer ' 前綴}try {// 解碼并驗證 Token$data = JwtHandler::getData($token);if (!$data) {$this->handleTokenError('Invalid or expired token');}// 將解碼的用戶數據附加到請求對象$request->user = $data;} catch (\Exception $e) {$this->handleTokenError('Invalid or expired token');}return $next($request);}// 處理 Token 錯誤的公共方法private function handleTokenError($message): void{// 在生產環境中提供簡潔的錯誤信息if (Env::get('app.env') === 'production') {json(['code' => 401,'message' => 'Invalid or expired token']);return;}// 在開發環境中提供詳細的錯誤信息json(['code' => 401,'message' => $message]);}
}

app\common\library\JwtHandler;

<?phpnamespace app\common\library;use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\exception\ValidateException;class JwtHandler
{private static string $key = 'quwei';  // 密鑰/*** 生成JWT* @param array $payload* @return string* @throws ValidateException*/public static function encode(array $payload): string{$issuedAt = time(); // 當前時間$expirationTime = $issuedAt + 60;  // 設置過期時間為1小時$payload['iat'] = $issuedAt;  // 簽發時間$payload['exp'] = $expirationTime; // 過期時間try {// 生成JWTreturn JWT::encode($payload, self::$key, 'HS256');} catch (\UnexpectedValueException $e) {throw new ValidateException('Error encoding JWT: ' . $e->getMessage());}}/*** 解碼JWT* @param string $jwt* @return object|null* @throws ValidateException*/public static function decode(string $jwt): ?object{try {// 解碼JWTreturn JWT::decode($jwt, new Key(self::$key, 'HS256'));} catch (\Firebase\JWT\ExpiredException $e) {throw new ValidateException('Token expired: ' . $e->getMessage());} catch (\UnexpectedValueException $e) {throw new ValidateException('Invalid token: ' . $e->getMessage());} catch (\Exception $e) {throw new ValidateException('Error decoding JWT: ' . $e->getMessage());}}/*** 獲取JWT中的數據* @param string $jwt* @return array|null*/public static function getData(string $jwt): ?array{try {$decoded = self::decode($jwt);return $decoded ? (array)$decoded : null;} catch (ValidateException $e) {return null; // 解碼失敗時返回 null}}
}

app\api\controller\auth.php

<?phpnamespace app\api\controller;use app\BaseController;
use app\common\library\JwtHandler;
use think\Request;
use think\response\Json;class Auth extends BaseController
{/*** 用戶登錄,生成JWT* @param Request $request* @return Json*/public function login(Request $request): Json{$username = $request->post('username');$password = $request->post('password');// 假設你通過用戶名和密碼來驗證用戶if ($username === 'John' && $password === '123') {// 生成 JWT,payload 可以根據需要調整$payload = ['sub' => 1, // 用戶ID'name' => $username,'role' => 'admin'];// 生成JWT$jwt = JwtHandler::encode($payload);return json(['code' => 200, 'message' => 'Login successful', 'token' => $jwt]);}return json(['code' => 400, 'message' => 'Invalid credentials'], 400);}/*** 驗證JWT,獲取用戶信息* @param Request $request* @return Json*/public function me(Request $request): Json{$token = $request->header('Authorization');  // 獲取Authorization頭中的Tokenif (!$token) {return json(['code' => 401, 'message' => 'Token not provided'], 401);}// 解碼Tokentry {$data = JwtHandler::getData($token);if ($data) {return json(['code' => 200, 'message' => 'Success', 'data' => $data]);}return json(['code' => 401, 'message' => 'Invalid or expired token'], 401);} catch (\Exception $e) {return json(['code' => 401, 'message' => 'Invalid or expired token'], 401);}}public function getUserProfile(Request $request): Json{// 直接訪問解碼后的用戶信息$user = $request->user;// 返回當前用戶的個人資料return json(['code' => 200, 'data' => $user]);}
}

這是完整的步驟,歡迎大家指正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88663.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ReactNative【實戰系列教程】我的小紅書 5 -- 文章詳情(含輪播圖 ImageSlider,點亮紅心動畫 Heart,嵌套評論等)

最終效果 安裝依賴 npm i dayjs用于對時間進行格式化 必備組件 輪播圖 ImageSlider https://blog.csdn.net/weixin_41192489/article/details/149224510 點亮紅心動畫 Heart components/Heart.tsx import AntDesign from "expo/vector-icons/AntDesign"; import …

嗶哩嗶哩第三方TV-BBLL最新版

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【百款黑科技】&#xff1a;https://uc…

用YOLOv5系列教程(1)-用YOLOv5輕松實現設備狀態智能監控!工業級教程來了

用YOLOv5輕松實現設備狀態智能監控&#xff01;工業級教程來了設備運維革命&#xff1a;15分鐘教會你的攝像頭看懂指示燈狀態工業現場各種設備狀態指示燈是工程師的"眼睛"——紅燈報警、綠燈運行、黃燈待機。但人工巡檢耗時費力&#xff0c;關鍵故障容易漏檢&#xf…

筆記-分布式計算基礎

Distributed Computing 劃分數據并行&#xff08;DataParallelism&#xff09;將數據分為n份&#xff0c;發送到n個GPU上&#xff0c;每個GPU上都存在一個完整的大模型 缺點&#xff1a; 模型太大Pipeline Parallelism&#xff08;串行的&#xff09;將模型做split,每個GPU負責…

Android Studio 2024,小白入門喂飯級教程

一、下載Android Studio 1、從安卓官網安卓官網下載Android Studio。 ? ? 二、安裝Android Studio 1、雙擊android-studio-2024.3.2.15-windows.exe。 ? ?? ? ? ? ? 三、新建工程 1、雙擊桌面圖標? 打開Android Studio。 ? 選“Empty Views Activity…

AI智能體 | 使用Coze制作一鍵生成單詞洗腦循環視頻,一天批量生成100條視頻不是夢!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型-單詞 2.3 大模型_圖像生成 2.4 輸出 2.5 圖像生成_1 2.6 輸出_2 2.7 畫板_2 2.8 文本處理 2.9 輸出_3 2.10 speech_synthesis_1x5 2.11 get_audio_duration_1 2.12 代碼 2.13 get_audio_durati…

質量屬性場景(Quality Attribute Scenario)深度解析

本質定義:質量屬性場景(Quality Attribute Scenario)是精確描述軟件系統質量要求的結構化方法,通過標準化的場景模板將抽象的質量屬性轉化為可測量、可驗證的具體行為描述,為架構設計提供客觀評估基準。 一、質量屬性場景核心結構 1. 六元組標準模板 #mermaid-svg-AGbvPVRu…

Java_Springboot技術框架講解部分(一)

首先講解一下&#xff1a;Java技術棧中&#xff0c;目前Spring Boot在國內的關注趨勢也日漸超過Spring。Spring Boot是Spring家族中的一個全新的框架&#xff0c;它用來簡化Spring應用程序的創建和開發過程。采用Spring Boot可以非常容易和快速的構建基于Spring框架的應用程序&…

從OpenMV到執行器:當PID算法開始“調教”舵機

如果到現在還不會驅動舵機——朋友&#xff0c;電賽的元器件清單每年都在對你“明示”&#xff0c;二維云臺都快成祖傳考題了&#xff01;補課&#xff1f;現在&#xff01;立刻&#xff01;&#xff08;當然&#xff0c;如果你臉皮夠厚&#xff0c;也可以私信騷擾作者&#xf…

xml映射文件的方式操作mybatis

映射文件 在Java spring中使用mybatis有兩種方式&#xff0c;一種是注釋的方式&#xff0c;一種是xml映射文件的方式。在簡單的功能需求可以使用注釋&#xff0c;方便簡潔。而在大的功能邏輯上&#xff0c;更推薦使用xml映射文件&#xff0c;方便管理且結構清晰。 首先xml文件結…

Carla自動駕駛仿真_快速安裝與運行Carla

大家好&#xff0c;我是橙子&#xff0c;今天給大家介紹Carla的基礎安裝和使用 目錄 1.Carla介紹 2.Carla的安裝與使用 3.Carla0.9.15安裝包下載&#xff1a; ?編輯 4.運行Demo 5.運行一個簡單場景&#xff1a; 6.相關資源 1.Carla介紹 Carla 是一個開源的自動駕駛仿…

遠程登錄docker執行shell報錯input is not a terminal問題

背景 最近要遠程去k8s docker里面獲取信息&#xff0c;于是&#xff0c;寫了一個如下的命令&#xff0c;執行完之后&#xff0c;報錯了。 ssh 192.168.100.2 sudo crictl exec -it xxx.docker /usr/bin/lscpu --online --extended錯誤信息如下&#xff1a; time“2025-07-11T21…

使用FastAdmin框架開發二

繼上一篇使用FastAdmin框架開發-CSDN博客教程 部署完項目后我們就可以邊開發邊調試了 在開發前我們可以先做一些基本設置 安裝成功后會生成一個項目后臺的地址http://域名/VrHGtzlfMB.php/index/login&#xff0c;后臺入口文件是隨機生成的&#xff0c;當然我們也可以根據我…

【DB2】load報錯SQL3501W、SQL3109N、SQL2036N

最近老遇到遷移測試LOAD時報錯&#xff0c;如圖所示但是換成import又可以看描述是說load的內容將不會進入備份暫掛狀態balbala… 下面的錯誤是說ixf文件無效 這里一直以為是SQL3501W的問題&#xff0c;去各種研究load參數和db2set里面的load參數&#xff0c;各種調整都不行 又以…

YOLO家族內戰!v5/v8/v10誰才是你的真命天子?(附保姆級選擇指南)

在目標檢測領域&#xff0c;YOLO系列始終是工業部署與學術研究的焦點。從風靡全網的YOLOv5&#xff0c;到全面升級的YOLOv8&#xff0c;再到突破性能瓶頸的YOLOv10——每一次迭代都帶來全新可能。作為開發者&#xff0c;究竟該選哪一代&#xff1f;本文用千字長文對比表格為你徹…

Claude Code是什么?國內如何使用到Claude Code?附國內最新使用教程

2025年已過大半&#xff0c;相信你也聽說過 Claude——它是近年最受關注的 AI 模型之一&#xff0c;而 Claude Code 則是它面向編程場景的特別版本&#xff0c;專為代碼理解、生成與重構而生&#xff0c;尤其擅長處理大項目、長上下文&#xff0c;和開發者對話更自然。 但對于一…

雙輪驅動:政策激勵與外部制約下的國產服務器市場演進

2025年6月&#xff0c;科智咨詢正式發布《中國國產服務器市場研究報告&#xff08;2025&#xff09;》&#xff0c;報告從國產服務器產業概述、政策環境分析、市場現狀與競爭格局、面臨挑戰與市場機遇等維度&#xff0c;深入剖析國產服務器市場現狀及未來發展趨勢。2022年10月&…

【工具變量】全國省市區縣土地出讓結果公告數據(2000-2024年)

土地出讓結果公告數據是指政府主管部門在完成國有土地使用權出讓后&#xff0c;依法依規對外公開的結果信息&#xff0c;涵蓋土地出讓時間、出讓方式、競得人、成交價、用地性質、面積等關鍵信息。土地出讓數據是研究中國土地市場供需變化、城市發展軌跡以及地方財政收入結構的…

前端面試專欄-算法篇:22.樹結構(二叉樹、B樹、紅黑樹)

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 樹結構&#xff08;二叉樹、B樹、紅黑樹&#xff09…

爬蟲-數據解析

1.解析概述特性re (正則表達式)bs4 (BeautifulSoup)xpath (lxml)pyquery本質文本模式匹配HTML/XML 解析器 (DOM樹操作)XML路徑語言 (節點導航)jQuery 式 CSS 選擇器 (封裝lxml)學習曲線陡峭中等中等簡單 (熟悉jQuery/CSS)靈活性極高 (處理任意文本)高 (容錯好&#xff0c;DOM操…