溫馨提示×

溫馨提示×

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

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

ThinkPHP5-使用think-API部署JWT的案例

發(fā)布時間:2020-12-31 14:57:17 來源:億速云 閱讀:270 作者:小新 欄目:編程語言

這篇文章主要介紹ThinkPHP5-使用think-API部署JWT的案例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

因為下一個項目要用 TP5 開發(fā)一個小程序,所以就使用到了,TP 框架,因為小程序開發(fā)需要后臺來編寫 api 接口,所以就上網(wǎng)查了一下有沒有相關(guān)的依賴,在此推薦一下 think-api 擴展工具,因為主要想使用其中的 jwt 功能來判斷小程序用戶的登錄狀態(tài),下面就以本人的項目為例,簡單和大家聊一下,通過 think-api 來部署 JWT。

1. 安裝依賴

本人使用的 TP 版本是 TP5.1,擴展下載地址:https://github.com/czewail/think-api ,通過 composer 安裝依賴:

$ composer require zewail/think-api:1.1.x

2. 配置說明

擴展安裝完畢后,咱們可以在 vendor/think-api/config/jwt.php 文件中查看 jwt 的配置。

主要是用戶模型路徑那塊,需要修改一下:

return [
    // 加密算法
    'algorithm'      => 'HS256',
    // HMAC算法使用的加密字符串
    'key'            => 'ex-key',
    // RSA算法使用的私鑰文件路徑
    'privateKeyPath' => '/home/rsa_private_key.pem',
    // RSA算法使用的公鑰文件路徑
    'publicKeyPath'  => '/home/rsa_public_key.pem',
    // 誤差時間,單位秒
    'deviation'      => 60,
    // 過期時間, 單位分鐘
    'ttl'            => 120,
    // 用戶模型路徑
    'user'           => app\api\model\User::class,
];

3. 創(chuàng)建 API 接口控制器

通過命令行創(chuàng)建我們想要反回 Token 給前端的控制器

$ php thnk make:controller api/Index

4. 引用依賴

在創(chuàng)建的文件頭添加文件路徑:use Zewail\Api\Facades\JWT; 案例代碼如下:

public function index()
    {
        //獲取前臺發(fā)送過來的登錄信息
        $tel      = $this->request->tel;
        $password = $this->request->passwword;
        //把登錄信息傳入JWT驗證匹配
        $credentials = ['tel' => $tel, 'password' => $password];
        //1.驗證通過返回token  1和2任意取一種方式
        $token = JWT::attempt($credentials);
        //2.通過已有賬戶模型生成token  1和2任意取一種方式
        $user  = User::find(84);
        $token = JWT::fromUser($user);
        $msg   = "驗證成功";
        //把token發(fā)送給前臺確認是否成功登陸
        return $this->ApiSuccess($token, $msg);
    }

有一點需要注意因為 API 離默認的接收參數(shù)是 mobile 和 password 。上門的例子中是 tel 和 password 。更改了變量名稱,所以我們需要在用戶模型中接入一下代碼來說明。以此類推。

public $jwtSub = 'tel';

5. 配置路由

在 route/route.php 中加入路由地址 Route::get('api/test', 'api/Index/index');

6. 運行測試

在 postman 中測試結(jié)果如下,這樣咱們就可以在后臺生成 token 返給前臺驗證登錄了。

ThinkPHP5-使用think-API部署JWT的案例

7. 驗證 token (補充)

我們在 postman 中把之前生成的 token 已頭部的方式重新發(fā)送到后臺,來進行 token 驗證,以下圖為例。

ThinkPHP5-使用think-API部署JWT的案例

之后攜帶頭部訪問驗證路由,驗證代碼如下:

       if ($user = JWT::authenticate()) {
                return true;
        }

如果驗證無誤就會返回 true。

8. 關(guān)于 token 不存在及 token 過期的問題處理(補充)

在 vendor\think-api\src\JWT/Factories\code.php 文件中 think-api 接口為咱們提供了對應(yīng)的錯誤反饋。

// 檢查是否過期
if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) {
    throw new TokenExpiredException('該 Token 已過期');
}
// 驗證簽名
if (!$this->verify("$header64.$payload64", $signature)) {
    throw new TokenInvalidException('無效的 Token');
}

那么咱們?nèi)绾卫眠@些狀態(tài)反饋呢,這就要使用前置中間件的方式來對前端發(fā)送的 token 信息進行驗證。

首先創(chuàng)建中間件:

$ php think make:middle Test

然后在中間件中寫入以下內(nèi)容:

  //用try catch捕獲報錯反饋
    public function handle($request, Closure $next)
    {
        try {
            if (!$user = JWT::authenticate()) {
                return response()->json([
                    'errcode' => 1004,
                    'errmsg'  => '無此用戶',
                ], 404);
            }
            return $next($request);
        } catch (TokenExpiredException $e) {
            return response()->json([
                'errcode' => 1003,
                'errmsg'  => 'token 過期', //token已過期
            ]);
        } catch (TokenInvalidException $e) {
            return response()->json([
                'errcode' => 1002,
                'errmsg'  => 'token 無效', //token無效
            ]);
        } catch (JWTException $e) {
            return response()->json([
                'errcode' => 1001,
                'errmsg'  => '缺少token', //token為空
            ]);
        }
    }

之后再在路由上門引用就可以了。

以上是“ThinkPHP5-使用think-API部署JWT的案例”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI