PHP如何使用JWT做Api介面身份認證的實現

2022-09-26 03:27:11 字數 2603 閱讀 3346

1.jwt是什麼?

jwt官網

官網簡介:json web令牌(jwt)是乙個開放標準(rfc 7519),它定義了一種緊湊且自包含的方式,用於在各方之間作為json物件安全地傳輸資訊。由於此資訊是經過數字簽名的,因此可以被驗證和信任。可以使用秘密(使用hmac演算法)或使用rsa或ecdsa的公鑰/私鑰對對jwt進行簽名。

通常來說,jwt是乙個由包含使用者資訊所生成的加密串,將生成的jwt加密串放入所有的請求head中,前端通過設定的秘鑰加密引數,傳送資料給後端,後端接收引數,按照設定的秘鑰,同樣加密接收引數,與前端加密引數做比對,保證請求有效並防止引數不被篡改。驗證通過就進行相關的邏輯處理,否則請求算作無效請求。

2.為什麼使用jwt?

傳統網際網路專案在實現保持登入狀態、退出登入、介面請求等功能時會使用session,但是眾所周知session資料在產生後會儲存與伺服器端,所以當使用者量達到一定程度會相應影響到伺服器的效能,且session在前後端分離的專案中或是多伺服器專案中的支援不是很好。但是token不會產生這些問題,伺服器端對token只有生成和驗證操作,不會存放資料,針對前後端分離的專案,包括手機app和當前熱門的小程式的支援都很不錯,所以token成為了用於驗證的極好選擇。

3.在專案中引入jwt擴充套件

co require firebase/php-jwt

4.jwt具體使用步驟

在登入控制器中

$key = 'e10adc3949ba59abbe56e057f20f883e';//自定義秘鑰,加密解密都需要用到

$time = time(); //當前時間

$token = [

'iat' => $程式設計客棧time, //簽發時間

'nbf' => $time, //(not before):某個時間點後才能訪問,比如設定time+30,表示當前時間30秒後才能使用

'data' => [

'userid' => 1,

'username' => 'zqw.xyz',

]];$jwttoken = \firebase\jwt\jwt::encode($token, $key);

登入成功後,將生成 token 返回給前端。前端記錄該使用者資訊的 token ,將 token 放入 head,之後的請求中都需要 head 都需包含 token。

我們可以定義乙個 appid 和 appsecret,同時告知前端。前端每次請求中攜帶 appid ,請求引數加入乙個必要引數 sign ,sign 是由所有請求引數拼接而成加密後的加密串。

注意: sign 引數值,需要加入 appid 所需要對應 appsecret,請求引數和後端約定相同排序規則,然後進行加密。

後端驗證簽名是否通過

$token = $request->instance()->header('token');

if(empty($token))

$appid = $request->param('appid');

if(empty($appid))

$request_time = $request->param('request_time');

if(empty($request_time))

$random_number = $request->param('random_number');

if(empty($random_number))

//記錄每次請求的uuid,如果uuid已存在,則該次請求無效。

$request_uuid = db::name(程式設計客棧'request')->where('uuid',$random_number)->find();

if(count($request_uuid) > 1)else

$secret_type = [

'appid1' => 'bd98e16b5eaf3e49fa2ecd3f9ee8f6ae',

'appid2' => 'b7e23061042f279pajdjbstx9180e41d94cdbf861',

];$secret = $secret_type[$appid];

if(empty($random_number))

$sign = $request->param('sign');

if(empty($sign))

$all_obj['secret'] = $secret;

ksort($all_obj);

$sign_key = '';

foreach ($all_obj as $k => $v)

$sign_key = substr_replace($sign_key ,"", -1);

$md_sign = md5($sign_key);

if($sign !== $md_sign)

注意: 為防止重複請求,建議由前端每次傳入 uuid ,根據 uuid 請求是否重複。

6.驗證通過後,進行相關的業務邏輯**處理。

// $result = array(

'status' => 1,

'msg' => '獲取成功',

'result' => array(

));return json($result)

本文標題: php如何使用jwt做api介面身份認證的實現

本文位址:

如何使用JWT做簡單的登入操作

註冊登入方面的鑑權對於乙個 來說是及其重要的,不僅可以保護你的個人資訊,還可以方便後續的操作。今天和大家聊一下我們的登入註冊流程是怎麼樣的。我們知道登入方面有很多種情況,比如可以使用賬號密碼進行登入,可以使用掃碼登入,還可以使用第三方的賬號登入,其實原理都是大同小異的,無非就是驗證你的賬號是否合理以...

使用Jwt令牌做單點登陸

使用springboot搭建後台,整合jwt令牌,作為token io.jsonwebtokengroupid jjwtartifactid 0.9.1version dependency jwt jwt配置,提供個jwtutils類去使用 key kaikai ty jwt生成token時的金鑰 ...

PHP使用JWT實現介面令牌驗證

jwt封裝控制器namespace api user controller use cmf controller restbasecontroller use firebase jwt jwt jwt整合包 use think cache use think model class jwt clas...