首頁 >php框架 >ThinkPHP >ThinkPHP5-使用 think-API 部署 JWT

ThinkPHP5-使用 think-API 部署 JWT

藏色散人
藏色散人轉載
2019-09-12 10:56:473506瀏覽

因為下一個專案要用TP5 開發一個小程序,所以就使用到了,TP 框架,因為小程序開發需要後台來編寫api 接口,所以就上網查了一下有沒有相關的依賴,在此推薦一下think-api 擴充工具,因為主要想使用其中的jwt 功能來判斷小程式使用者的登入狀態,下面就以本人的專案為例,簡單和大家聊一下,透過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. 建立API 介面控制器

透過命令列建立我們想若要反回Token 給前端的控制器

$ php thnk make:controller api/Index

4. 引用依賴

在建立的檔案頭新增檔案路徑:use Zewail\Api\Facades\JWT;案例代碼如下:

public function index()
    {
        //获取前台发送过来的登录信息
        $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发送给前台确认是否成功登陆
        return $this->ApiSuccess($token, $msg);
    }

有一點要注意因為API 離預設的接收參數是mobile 和password 。上門的例子中是 tel 和 password 。更改了變數名稱,所以我們需要在使用者模型中接取程式碼來說明。以此類推。

public $jwtSub = 'tel';

5. 設定路由

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

#6. 執行測試

在postman 中測試結果如下,這樣咱們就可以在背景產生token 返給前台驗證登入了。

ThinkPHP5-使用 think-API 部署 JWT

7. 驗證token (補充)

我們在postman 中把之前產生的token 已頭部的方式重新發送到後台,來進行token 驗證,以下圖為例。

ThinkPHP5-使用 think-API 部署 JWT

之後攜帶頭部存取驗證路由,驗證程式碼如下:

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

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

8. 關於token 不存在及token 過期的問題處理(補充)

在vendor\think-api\src\JWT/Factories\code.php 文件中think-api 介面為咱們提供了對應的錯誤回饋。

// 检查是否过期
if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) {
    throw new TokenExpiredException('该 Token 已过期');
}
// 验证签名
if (!$this->verify("$header64.$payload64", $signature)) {
    throw new TokenInvalidException('无效的 Token');
}

那麼咱們如何利用這些狀態回饋呢,這就要使用前置中間件的方式來對前端發送的 token 訊息進行驗證。

先建立中間件:

$ php think make:middle Test

然後在中間件中寫入以下內容:

  //用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为空
            ]);
        }
    }

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

推薦教學:thinkphp教學

#

以上是ThinkPHP5-使用 think-API 部署 JWT的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除