亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

thinkphp6中怎么使用jwt認證

發布時間:2022-06-24 13:58:31 來源:億速云 閱讀:215 作者:iii 欄目:編程語言

本篇內容主要講解“thinkphp6中怎么使用jwt認證”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“thinkphp6中怎么使用jwt認證”吧!

thinkphp6 使用jwt

  1. 客戶端使用用戶名和密碼請求登錄

  2. 服務端收到請求,驗證用戶名和密碼

  3. 驗證成功后,服務端會簽發一個token,再把這個token返回給客戶端

  4. 客戶端收到token后可以把它存儲起來,比如放到cookie中

  5. 客戶端每次向服務端請求資源時需要攜帶服務端簽發的token,可以在cookie或者header中攜帶

  6. 服務端收到請求,然后去驗證客戶端請求里面帶著的token,如果驗證成功,就向客戶端返回請求數據

安裝 jwt 擴展

composer require firebase/php-jwt

安裝之后在 vender 目錄下的 firebase 文件夾下

調用 JWT里面的 encode 和 decode方法進行生成token和驗證token

項目app 目錄下的 common.php全局文件使用的 ,做成了公共方法,由于我是多應用的,所以就寫在了api下面的common.php,大家可以根據自己需求適當調整

首先 引入 JWT ,然后寫兩個方法,生成驗簽和驗證token。

<?phpuse \Firebase\JWT\JWT;use Firebase\JWT\Key;// 應用公共文件/**
 * 生成驗簽
 * @param $uid 用戶id
 * @return mixed
 */function signToken($uid){
    $key='abcdefg';         //自定義的一個隨機字串用戶于加密中常用的 鹽  salt
    $token=array(
        "iss"=>$key,        //簽發者 可以為空
        "aud"=>'',          //面象的用戶,可以為空
        "iat"=>time(),      //簽發時間
        "nbf"=>time(),      //在什么時候jwt開始生效
        "exp"=> time()+30,  //token 過期時間
        "data"=>[           //記錄的uid的信息
            'uid'=>$uid,
        ]
    );
    $jwt = JWT::encode($token, $key, "HS256");  //生成了 token
    return $jwt;}/**
 * 驗證token
 * @param $token
 * @return array|int[]
 */function checkToken($token){
    $key='abcdefg';     //自定義的一個隨機字串用戶于加密中常用的 鹽  salt
    $res['status'] = false;
    try {
        JWT::$leeway    = 60;//當前時間減去60,把時間留點余地
        $decoded        = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,這里要和簽發的時候對應
        $arr            = (array)$decoded;
        $res['status']  = 200;
        $res['data']    =(array)$arr['data'];
        return $res;

    } catch(\Firebase\JWT\SignatureInvalidException $e) { //簽名不正確
        $res['info']    = "簽名不正確";
        return $res;
    }catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之后才能用
        $res['info']    = "token失效";
        return $res;
    }catch(\Firebase\JWT\ExpiredException $e) { // token過期
        $res['info']    = "token過期";
        return $res;
    }catch(Exception $e) { //其他錯誤
        $res['info']    = "未知錯誤";
        return $res;
    }}

使用jwt生成token

    /**
     * 使用jwt生成token字符串
     */
    public function setJwtToken()
    {
        $uid = input('uid'); // 接收生成token字符串 如:123
        $token = signToken($uid);
        // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s
        echo $token;die;
    }

    /**
     * 使用jwt驗證token字符串
     */
    public function checkJwtToken()
    {
        $token  = input('token'); // 接收生成token字符串
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }

創建 user 控制器

<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{
    public function login(Request $request)
    {
        if ($request->isPost()){
            $username = $request->param('username','','trim');
            $password = $request->param('password','','trim');

            //查詢數據庫
            $user = Db::name('user')->where('username',$username)->find();

            if (!$user){
                return json(['status' => 'fail','msg' => '用戶名不存在']);
            }
            if ($user['password']!==md5($password)){
                return json(['status' => 'fail','msg' => '密碼錯誤']);
            }
            $getToken = $this->token($user);
            return json(['status' => 'success','msg' => '登陸成功','token' => $getToken]);
        }
    }
    public function token($user)
    {
        $uid = $user['username']; // 接收生成token字符串 如:123
        $token = signToken($uid);
        dd($token);
    }
    /**
     * 驗證token
     */
    public function chToken()
    {
        $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw';
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }}

用戶登錄成功返回給前端token,前端將token存儲起來,在下次請求的時候頭部攜帶著這個token,后端接受token,在中間件中進行驗證

創建api中間件

<?phpdeclare (strict_types = 1);namespace app\middleware;class Api{
    /**
     * 處理請求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //toke 合法性驗證
        $header = $request->header();
        //判讀請求頭里有沒有token
        if(!isset($header['token'])){
            return json(['code'=>440,'msg'=>'request must with token']);
        }
        $token = $header['token'];

        try {
            // token 合法
            $token = checkToken($token);
        }catch (\Exception $e){
            return json(['code'=>440,'msg'=>'invalid token']);
        }

        return $next($request);
    }}

到此,相信大家對“thinkphp6中怎么使用jwt認證”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡| 左云县| 五常市| 东港市| 烟台市| 苗栗县| 西乡县| 霍林郭勒市| 安岳县| 招远市| 民乐县| 无锡市| 金川县| 中宁县| 沿河| 友谊县| 吉水县| 大渡口区| 灌阳县| 合江县| 城口县| 梓潼县| 兴国县| 永安市| 海林市| 尼木县| 延津县| 宣化县| 宜章县| 上饶市| 清河县| 宜宾市| 临漳县| 咸宁市| 青浦区| 饶河县| 班玛县| 江源县| 东安县| 昭觉县| 哈尔滨市|