JWT通過user_token解析

一、登錄流程?

前端發(fā)送請求 -> 后端驗證通過后簽發(fā) Token -> 前端存入token,在請求其他接口是將token帶入header頭中

二、使用步驟

1.引入 jwt 庫

安裝:

composer require firebase/php-jwt

依賴composer,通過 cmd 進入項目根目錄 或者 項目終端 安裝:

檢查項目vendor文件中生成了以下文件就代表安裝成功

45adac3656a54250b58c9922507af22d.png

引入:

use Firebase\JWT\JWT;       

2.生成 token
代碼:

    public function loginpwd($username, $password)
    {
        $password = md5($password);
        $loginpwd = new user();
        $checkuser = $loginpwd->checkuser($username, $password);
        if ($checkuser['code'] == 0) { 
            return json($checkuser);
        } else if ($checkuser['code'] == 1) { 
            $key = 'adminTokenpwd';
            $token = array(
                "iat" => time(),
                "nbf" => time(),
                "exp" => time() + 60 * 60 * 24 * 7,
                "uid" => $checkuser['id']
            );
            $jwt = JWT::encode($token, $key, "HS256");
            return json(['code' => 1, 'msg' => '登陸成功', 'token' => $jwt]);
        } else { 
            return json($checkuser);
        }
    }

核心:

               $key = 'adminTokenpwd';                 //自定義key,必須與驗證token中的key一致
 
               $token = array(
 
               "iat" => time(),                    // jwt的簽發(fā)時間
 
               "nbf" => time(),                    //定義在某個時間前 jwt 是不可用的
 
               "exp" => time() + 60 * 60 * 24 * 7,   // jwt 的過期時間(大于簽發(fā)時間),規(guī)則:秒*分*時*天
 
               "uid" => $checkuser['id']           // 自定義的數(shù)據(jù):這里我?guī)Я擞脩鬷d
 
            );
 
               $jwt = JWT::encode($token, $key, "HS256");      //調用方法
 

返回數(shù)據(jù)格式:

877664ec9c9f4af4afbe17a9661563ef.png

3.解密 token
我是在控制器中單獨創(chuàng)建的一個Token文件,也可以放在中間件。

這里我繼承的BaseController ,其他接口文件直接繼承Token

引入:

use Exception;
use Throwable;
use Firebase\JWT\JWT;
use app\BaseController;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\SignatureInvalidException;

驗證方法:

``PHP
class Token extends BaseController
{
/**
* Token驗證
*/
// 驗證 token
protected function initialize()
{
parent::initialize();
header = request()->header(); if (!isset(header['token']) || header['token'] == null) { echo json(['code' => 0, 'msg' => 'token不能為空'], 400)->send(); die(); }token = $header['token'];

    $key = 'adminTokenpwd'; // 解密token,key必須與簽發(fā)token中的key一致
    try {
        $info = JWT::decode($token, $key, ['HS256']);
        $this->uid = $info->uid;
    } catch (SignatureInvalidException $e) { //簽名不正確
        echo json(['code' => 0, 'status' => $e->getCode(), 'msg' => '簽名不正確'], 400)->send();
        die();
    } catch (BeforeValidException $e) { // 簽名在某個時間點之后才能用
        echo json(['code' => 1, 'status' => $e->getCode(), 'msg' => '賬號未到可用時間'], 400)->send();
        die();
    } catch (ExpiredException $e) { // token過期
        echo json(['code' => 2, 'status' => $e->getCode(), 'msg' => '登錄狀態(tài)過期'], 400)->send();
        die();
    } catch (Exception $e) { //其他錯誤
        echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
        die();
    } catch (Throwable $e) {
        echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
        die();
    }
}

}


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容