注意段落开头不要有空格
此投稿已在 6年前 合并。
内容修改:
| Old | New | Differences |
|---|---|---|
| 1 | 因为下一个项目要用TP5开发一个小程序,所以就使用到了,TP框架,因为小程序开发需要后台来编写api接口,所以就上网查了一下有没有相关的依赖,在此推荐一下think-api扩展工具,因为主要想使用其中的jwt功能来判断小程序用户的登录状态,下面就以本人的项目为例,简单和大家聊一下,通过think-api来部署JWT。 | |
| 2 | 1.安装依赖 | |
| 3 | 本人使用的TP版本是TP5.1,扩展下载地址:https://github.com/czewail/think-api ,通过composer安装依赖。 | |
| 4 | `composer require zewail/think-api:1.1.x` | |
| 5 | 2.配置说明 | |
| 6 | 通过composer安装完毕后,咱们可以在 vendor/think-api/config/jwt.php文件中查看jwt的配置,主要是用户模型路径那块,需要修改一下。 | |
| 7 | ``` | |
| 8 | return [ | |
| 9 | // 加密算法 | |
| 10 | 'algorithm' => 'HS256', | |
| 11 | // HMAC算法使用的加密字符串 | |
| 12 | 'key' => 'ex-key', | |
| 13 | // RSA算法使用的私钥文件路径 | |
| 14 | 'privateKeyPath' => '/home/rsa_private_key.pem', | |
| 15 | // RSA算法使用的公钥文件路径 | |
| 16 | 'publicKeyPath' => '/home/rsa_public_key.pem', | |
| 17 | // 误差时间,单位秒 | |
| 18 | 'deviation' => 60, | |
| 19 | // 过期时间, 单位分钟 | |
| 20 | 'ttl' => 120, | |
| 21 | // 用户模型路径 | |
| 22 | 'user' => app\api\model\User::class, | |
| 23 | ]; | |
| 24 | ``` | |
| 25 | 3.创建API接口控制器 | |
| 26 | 通过命令行创建我们想要反回Token给前端的控制器 | |
| 27 | `php thnk make:controller api/Index` | |
| 28 | 4.引用依赖 | |
| 29 | 在创建的文件头添加文件路径: | |
| 30 | `use Zewail\Api\Facades\JWT;` | |
| 31 | 案例代码如下: | |
| 32 | ||
| 33 | public function index(){ | |
| 34 | //获取前台发送过来的登录信息 | |
| 35 | $tel = $this->request->tel; | |
| 36 | $password = $this->request->passwword; | |
| 37 | //把登录信息传入JWT验证匹配 | |
| 38 | $credentials = ['tel' => $tel, 'password' =>$password]; | |
| 39 | //1.验证通过返回token 1和2任意取一种方式 | |
| 40 | $token = JWT::attempt($credentials); | |
| 41 | //2.通过已有账户模型生成token 1和2任意取一种方式 | |
| 42 | $user=User::find(84); | |
| 43 | $token = JWT::fromUser($user); | |
| 44 | $msg = "验证成功"; | |
| 45 | //把token发送给前台确认是否成功登陆 | |
| 46 | return $this->ApiSuccess($token, $msg); | |
| 1 | 因为下一个项目要用TP5开发一个小程序,所以就使用到了,TP框架,因为小程序开发需要后台来编写api接口,所以就上网查了一下有没有相关的依赖,在此推荐一下think-api扩展工具,因为主要想使用其中的jwt功能来判断小程序用户的登录状态,下面就以本人的项目为例,简单和大家聊一下,通过think-api来部署JWT。 | |
| 2 | ||
| 3 | ### 1.安装依赖 | |
| 4 | 本人使用的 TP 版本是 TP5.1,扩展下载地址:https://github.com/czewail/think-api ,通过`composer`安装依赖: | |
| 5 | ``` | |
| 6 | $ composer require zewail/think-api:1.1.x | |
| 7 | ``` | |
| 8 | ||
| 9 | ### 2.配置说明 | |
| 10 | 扩展安装完毕后,咱们可以在 `vendor/think-api/config/jwt.php`文件中查看 jwt 的配置。 | |
| 11 | ||
| 12 | 主要是用户模型路径那块,需要修改一下: | |
| 13 | ||
| 14 | ```php | |
| 15 | return [ | |
| 16 | // 加密算法 | |
| 17 | 'algorithm' => 'HS256', | |
| 18 | // HMAC算法使用的加密字符串 | |
| 19 | 'key' => 'ex-key', | |
| 20 | // RSA算法使用的私钥文件路径 | |
| 21 | 'privateKeyPath' => '/home/rsa_private_key.pem', | |
| 22 | // RSA算法使用的公钥文件路径 | |
| 23 | 'publicKeyPath' => '/home/rsa_public_key.pem', | |
| 24 | // 误差时间,单位秒 | |
| 25 | 'deviation' => 60, | |
| 26 | // 过期时间, 单位分钟 | |
| 27 | 'ttl' => 120, | |
| 28 | // 用户模型路径 | |
| 29 | 'user' => app\api\model\User::class, | |
| 30 | ]; | |
| 31 | ``` | |
| 32 | ||
| 33 | ### 3.创建API接口控制器 | |
| 34 | 通过命令行创建我们想要反回Token给前端的控制器 | |
| 35 | ``` | |
| 36 | $ php thnk make:controller api/Index | |
| 37 | ``` | |
| 38 | ||
| 39 | ### 4.引用依赖 | |
| 40 | 在创建的文件头添加文件路径:`use Zewail\Api\Facades\JWT;`案例代码如下: | |
| 41 | ||
| 42 | ``` | |
| 43 | public function index() | |
| 44 | { | |
| 45 | //获取前台发送过来的登录信息 | |
| 46 | $tel = $this->request->tel; | |
| 47 | $password = $this->request->passwword; | |
| 48 | //把登录信息传入JWT验证匹配 | |
| 49 | $credentials = ['tel' => $tel, 'password' => $password]; | |
| 50 | //1.验证通过返回token 1和2任意取一种方式 | |
| 51 | $token = JWT::attempt($credentials); | |
| 52 | //2.通过已有账户模型生成token 1和2任意取一种方式 | |
| 53 | $user = User::find(84); | |
| 54 | $token = JWT::fromUser($user); | |
| 55 | $msg = "验证成功"; | |
| 56 | //把token发送给前台确认是否成功登陆 | |
| 57 | return $this->ApiSuccess($token, $msg); | |
| 47 | 58 | } |
| 48 | ||
| 49 | 有一点需要注意因为API离默认的接收参数是mobile和password。上门的例子中是tel和password。更改了变量名称,所以我们需要在用户模型中接入一下代码来说明。以此类推。 | |
| 50 | `public $jwtSub = 'tel';` | |
| 51 | 5.配置路由 | |
| 52 | 在 route/route.php中加入路由地址 | |
| 53 | `Route::get('api/test', 'api/Index/index');` | |
| 54 | 6.运行测试 | |
| 55 | 在postman中测试结果如下,这样咱们就可以在后台生成token返给前台验证登录了。 | |
| 56 | ||
| 59 | ``` | |
| 60 | ||
| 61 | 有一点需要注意因为API离默认的接收参数是 mobile 和 password 。上门的例子中是 tel 和 password 。更改了变量名称,所以我们需要在用户模型中接入一下代码来说明。以此类推。 | |
| 62 | `public $jwtSub = 'tel';` | |
| 63 | ||
| 64 | ### 5.配置路由 | |
| 65 | ||
| 66 | 在`route/route.php`中加入路由地址 `Route::get('api/test', 'api/Index/index');` | |
| 67 | ||
| 68 | ### 6.运行测试 | |
| 69 | ||
| 70 | 在 postman 中测试结果如下,这样咱们就可以在后台生成 token 返给前台验证登录了。 | |
| 71 | ||
| 57 | 72 |  |
| 58 | 73 | |
| 59 | ||
| 60 | ||
| 61 | ||
| 74 | ### 7.验证token(补充) | |
| 75 | 我们在 postman 中把之前生成的 token 已头部的方式重新发送到后台,来进行 token 验证,以下图为例。 | |
| 76 | ||
| 62 | 77 |  |
| 63 | 78 | |
| 64 | 79 | 之后携带头部访问验证路由,验证代码如下: |
| 65 | ||
| 66 | ||
| 80 | ``` | |
| 81 | if ($user = JWT::authenticate()) { | |
| 67 | 82 | return true; |
| 68 | 83 | } |
| 69 | ||
| 84 | ``` | |
| 70 | 85 | 如果验证无误就会返回true。 |
| 71 | 8.关于token不存在及token过期的问题处理(补充) | |
| 72 | 在 vendor\think-api\src\JWT/Factories\code.php 文件中think-api接口为咱们提供了对应的错误反馈。 | |
| 73 | ``` | |
| 74 | // 检查是否过期 | |
| 75 | if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) { | |
| 76 | throw new TokenExpiredException('该 Token 已过期'); | |
| 77 | } | |
| 78 | // 验证签名 | |
| 79 | if (!$this->verify("$header64.$payload64", $signature)) { | |
| 80 | throw new TokenInvalidException('无效的 Token'); | |
| 81 | } | |
| 82 | ``` | |
| 83 | 那么咱们如何利用这些状态反馈呢,这就要使用前置中间件的方式来对前端发送的token信息进行验证。 | |
| 84 | 首先创建中间件: | |
| 85 | `php think make:middle Test ` | |
| 86 | 然后在中间件中写入以下内容: | |
| 87 | ``` | |
| 88 | //用try catch捕获报错反馈 | |
| 89 | public function handle($request, Closure $next) | |
| 86 | ||
| 87 | ### 8.关于token不存在及token过期的问题处理(补充) | |
| 88 | ||
| 89 | 在 `vendor\think-api\src\JWT/Factories\code.php `文件中 think-api 接口为咱们提供了对应的错误反馈。 | |
| 90 | ||
| 91 | ``` | |
| 92 | // 检查是否过期 | |
| 93 | if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) { | |
| 94 | throw new TokenExpiredException('该 Token 已过期'); | |
| 95 | } | |
| 96 | // 验证签名 | |
| 97 | if (!$this->verify("$header64.$payload64", $signature)) { | |
| 98 | throw new TokenInvalidException('无效的 Token'); | |
| 99 | } | |
| 100 | ``` | |
| 101 | ||
| 102 | 那么咱们如何利用这些状态反馈呢,这就要使用前置中间件的方式来对前端发送的 token 信息进行验证。 | |
| 103 | ||
| 104 | 首先创建中间件: | |
| 105 | ``` | |
| 106 | $ php think make:middle Test | |
| 107 | ``` | |
| 108 | ||
| 109 | 然后在中间件中写入以下内容: | |
| 110 | ||
| 111 | ```php | |
| 112 | //用try catch捕获报错反馈 | |
| 113 | public function handle($request, Closure $next) | |
| 90 | 114 | { |
| 91 | 115 | try { |
| 92 | if (! | |
| 116 | if (!$user = JWT::authenticate()) { | |
| 93 | 117 | return response()->json([ |
| 94 | 118 | 'errcode' => 1004, |
| 95 | 'errmsg' | |
| 96 | ||
| 119 | 'errmsg' => '无此用户', | |
| 120 | ||
| 97 | 121 | ], 404); |
| 98 | 122 | } |
| 99 | | |
| 100 | ||
| 101 | | |
| 102 | ||
| 123 | return $next($request); | |
| 124 | ||
| 125 | } catch (TokenExpiredException $e) { | |
| 126 | ||
| 103 | 127 | return response()->json([ |
| 104 | 128 | 'errcode' => 1003, |
| 105 | 'errmsg' | |
| 129 | 'errmsg' => 'token 过期', //token已过期 | |
| 106 | 130 | ]); |
| 107 | ||
| 131 | ||
| 108 | 132 | } catch (TokenInvalidException $e) { |
| 109 | ||
| 133 | ||
| 110 | 134 | return response()->json([ |
| 111 | 135 | 'errcode' => 1002, |
| 112 | 'errmsg' | |
| 136 | 'errmsg' => 'token 无效', //token无效 | |
| 113 | 137 | ]); |
| 114 | ||
| 138 | ||
| 115 | 139 | } catch (JWTException $e) { |
| 116 | ||
| 140 | ||
| 117 | 141 | return response()->json([ |
| 118 | 142 | 'errcode' => 1001, |
| 119 | 'errmsg' | |
| 143 | 'errmsg' => '缺少token', //token为空 | |
| 120 | 144 | ]); |
| 121 | ||
| 145 | ||
| 122 | 146 | } |
| 123 | 147 | } |
| 124 | ||
| 125 | ||
| 148 | ``` | |
| 149 | ||
| 126 | 150 | 之后再在路由上门引用就可以了。 |
关于 LearnKu