jwt、tp中間件聽起來好高大上的樣子。
花了兩天時間閱讀文檔和看視頻,終于懂了點皮毛,在這里記錄一下。
以下兩個問題需要搞懂
1? jwt 是什么 ?
JWT 全稱 Json Web token,是為了在網絡應用環境間傳遞聲明而執行的一種基于json的開放標準(RFC 7519),該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者之間傳遞被認證的用戶身份信息,以便于從服務器獲取資源,也可以增加一些額外的其他業務邏輯所必須的聲明信息,該token也可之間被用于認證,也可以被加密。
簡而言之,我們這里要用到的就是jwt的加密和解密。
先簡單記錄一下
第一步 安裝jwt擴展
建議使用composer安裝 方便 快捷
composer require firebase/php-jwt
運行成功后顯示 圖一 圖二即安裝成功:
圖一:


第二步 調用 JWT里面的 encode 和 decode方法進行生成token和驗證token
我是在app 目錄下的 common.php 文件使用的 ,做成了公共方法
?首先 引入 JWT ,然后寫兩個方法,生成驗簽和驗證token。
~~~php
use \Firebase\JWT\JWT;
~~~
```
<?php
/\*
?\* @Descripttion: 梧桐樹科技
?\* @version: 1.0.1
?\* @Author: yms
?\* @Date: 2022-05-24 11:02:26
?\* @LastEditors: ymsxxx
?\* @LastEditTime: 2022-05-25 00:07:58
?\*/
namespace wt\\pluadd\\velogic;
use Firebase\\JWT\\JWT;
use Firebase\\JWT\\Key;
/\*\*
?\* @description: jwt驗證
?\* @Date: 2022-05-24 11:03:55
\* @return {\*}
?\* @LastEditTime: Do not Edit
?\*/
class VerufyJwt{
//生成驗簽
public function signToken($uid){
$key \= '!@#$%\*&'; //這里是自定義的一個隨機字串,應該寫在config文件中的,解密時也會用,相當 ? ?于加密中常用的 鹽 ?salt
$nowtime \= time();
echo ($nowtime + 100) . '';
/\*
? ? ? ? iss: jwt簽發者
? ? ? ? sub: jwt所面向的用戶
? ? ? ? aud: 接收jwt的一方
? ? ? ? exp: jwt的過期時間,這個過期時間必須要大于簽發時間
? ? ? ? nbf: 定義在什么時間之前,該jwt都是不可用的.
? ? ? ? iat: jwt的簽發時間
? ? ? ? jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。
? ? ? ? \*/
$token \= array(
"iss" \=> $key,//簽發者 可以為空
"aud" \=> '', ? ? ? ? ?//面象的用戶 可以為空
"iat" \=> $nowtime,//簽發時間
"nbf" \=> $nowtime + 3, ? ?//在什么時候jwt開始生效
"jti" \=> md5(uniqid('JWT') . time()), ? ?//該Token唯一標識
"exp" \=> $nowtime + 200, //token過期時間
"data" \=> \[ //記錄的userid的信息,這里是自已添加上去的,如果有其它信息,可以再添加數組的鍵值對
'uid' \=> $uid,
? ? ? ? ? ? \]
? ? ? ? );
$jwt \= JWT::encode($token, $key, "HS256"); ?//根據參數生成了 token
echo $jwt;
? ? }
//驗證token
function checkToken($token)
? ? {
//$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIhQCMkJSomIiwiYXVkIjoiIiwiaWF0IjoxNjI2NzA2NzgxLCJuYmYiOjE2MjY3MDY3ODQsImp0aSI6ImE0YmE2YTE5NzlkNjcyMDFlOGM1YjQxOWExNjI2ZmUxIiwiZXhwIjoxNjI2NzA2ODgxLCJkYXRhIjp7InVpZCI6MzMwMX19.LZI8WfvNA\_tqkE9Nop35Doa-wWw4R\_ZQlsiZn50Un7w';
$key \= '!@#$%\*&';
$status \= array("code" \=> 2);
try {
JWT::$leeway \= 60; //當前時間減去60,把時間留點余地,避免多服務器時間有誤差,設置leeway后,token的有效時間就是exp+leeway
$decoded \= JWT::decode($token, $key, array('HS256')); //HS256方式,這里要和簽發的時候對應
$arr \= (array)$decoded;
? ? ? ? ? ? $res\['code'\] \= 1;
? ? ? ? ? ? $res\['data'\] \= $arr\['data'\];
print\_r($res);
} catch (\\Firebase\\JWT\\SignatureInvalidException $e) { //簽名不正確
? ? ? ? ? ? $status\['msg'\] \= "簽名不正確";
print\_r($status);
} catch (\\Firebase\\JWT\\BeforeValidException $e) { // 簽名在某個時間點之后才能用
? ? ? ? ? ? $status\['msg'\] \= "token失效";
print\_r($status);
} catch (\\Firebase\\JWT\\ExpiredException $e) { // token過期
? ? ? ? ? ? $status\['msg'\] \= "token失效";
print\_r($status);
} catch (Exception $e) { //其他錯誤
? ? ? ? ? ? $status\['msg'\] \= "未知錯誤";
print\_r($status);
? ? ? ? }
? ? }
}
```
第三步:使用。
生成token ,這里是把用戶id進行加密,當然還可以添加其他參數,比如 ip,手機號,賬戶名等等。把要加密的信息傳給 singToken方法就可以。
1. $user\['token'\] = signToken($user\['id'\]);
4. // token 返回值
6. //eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtZGMhQCMkIiwiYXVkIjoiIiwiaWF0IjoxNTc5MTU3OTY4LCJuYmYiOjE1NzkxNTc5NzEsImV4cCI6MTU3OTE1ODE2OCwiZGF0YSI6eyJ1aWQiOjV9fQ.mFdRYr\_sf63U5STJoxfOFFRyJj8V4N\_h-sx3hQcZ2qk
驗證 token ,這里的token一般用 header 方式傳送,接收后直接調用 直接調用 common.php 文件的 checkToken方法即可。驗證成功返回加密的token信息。驗證失敗返回提示信息。
1. $token = Request::instance()->header('token');
2. $res = checkToken($token);
- thinkphp6執行流程(一)
- php中use關鍵字用法詳解
- Thinkphp6使用騰訊云發送短信步驟
- 路由配置
- Thinkphp6,static靜態資源訪問路徑問題
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳實踐
- Thinkphp6.0 搜索器使用方法
- 從已有安裝包(vendor)恢復 composer.json
- tp6with的用法,表間關聯查詢
- thinkphp6.x多對多如何添加中間表限制條件
- thinkphp6 安裝JWT
- 緩存類型
- 請求信息和HTTP頭信息
- 模型事件用法
- 助手函數匯總
- tp6集成Alipay 手機和電腦端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6筆記
- TP6(thinkphp6)隊列與延時隊列
- thinkphp6 command(自定義指令)
- command(自定義指令)
- 本地文件上傳
- 緩存
- 響應
- 公共函數配置
- 七牛云+文件上傳
- thinkphp6:訪問多個redis數據源(thinkphp6.0.5 / php 7.4.9)
- 富文本編輯器wangEditor3
- IP黑名單
- 增刪改查 +文件上傳
- workerman 定時器操作控制器的方法
- 上傳文件到阿里云oss
- 短信或者郵箱驗證碼防刷代碼
- thinkphp6:訪問redis6(thinkphp 6.0.9/php 8.0.14)
- 實現關聯多個id以逗號分開查詢數據
- thinkphp6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成帶logo的二維碼(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql數據庫使用事務(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,創建過濾IP的中間件
- 源碼解析請求流程
- 驗證碼生成
- 權限管理
- 自定義異常類
- 事件監聽event-listene
- 安裝與使用think-addons
- 事件與多應用
- Workerman 基本使用
- 查詢用戶列表按拼音字母排序
- 擴展包合集
- 查詢用戶數據,但是可以通過輸入用戶昵稱來搜索用戶同時還要統計用戶的文章和粉絲數
- 根據圖片的minetype類型獲取文件真實拓展名思路
- 到處excel
- 用imagemagick庫生成縮略圖
- 生成zip壓縮包并下載
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源碼分析三】 APP類之父, 容器Container類
- thinkphp6表單重復提交解決辦法
- 小程序授權
- 最簡單的thinkphp6導出Excel
- 根據訪問設備不同訪問不同模塊
- 服務系統
- 前置/后置中間件
- 給接口api做簽名驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- 6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 使用前后端分離的驗證碼(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分離:用jwt+middleware做用戶登錄驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分離多圖上傳
- thinkphp 分組、頁面跳轉與ajax
- thinkphp6 常用方法文檔
- 手冊里沒有的一些用法
- Swagger 3 API 注釋
- PHP 秒級定時任務
- thinkphp6集成gatewayWorker(workerman)實現實時監聽
- thinkphp6按月新增數據表
- 使用redis 實現消息隊列
- api接口 統一結果返回處理類
- 使用swoole+thinkphp6.0+redis 結合開發的登錄模塊
- 給接口api做簽名驗證
- ThinkPHP6.0 + UniApp 實現小程序的 微信登錄
- ThinkPHP6.0 + Vue + ElementUI + axios 的環境安裝到實現 CURD 操作!
- 異常$e
- 參數請求驗證自定義和異常錯誤自定義