lmaster 4年前

修改理由:

注意段落开头不要有空格

详细描述:

这个论坛用的 markdown 编辑器


此投稿已在 4年前 合并。

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
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
 15return [
 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);
4758   }
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         
5772![ThinkPhp5-使用think-api部署JWT](https://cdn.learnku.com/uploads/images/201906/30/38269/J9yIuqQGUn.png!large)
5873
59   7.验证token(补充)
60            我们在postman中把之前生成的token已头部的方式重新发送到后台,来进行token验证,以下图为例。
61            
 74### 7.验证token(补充)
 75我们在 postman 中把之前生成的 token 已头部的方式重新发送到后台,来进行 token 验证,以下图为例。
 76           
6277![ThinkPHP5-使用 think-API 部署 JWT](https://cdn.learnku.com/uploads/images/201907/02/38269/iD37UipyNA.png!large)
6378
6479之后携带头部访问验证路由,验证代码如下:
65      ```
66      if ($user = JWT::authenticate()) {
 80```
 81     if ($user = JWT::authenticate()) {
6782               return true;
6883       }
69        ```
 84 ```
7085如果验证无误就会返回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// 检查是否过期
 93if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) {
 94   throw new TokenExpiredException('该 Token 已过期');
 95}
 96// 验证签名
 97if (!$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)
90114   {
91115       try {
92            if (! $user = JWT::authenticate()) { 
 116           if (!$user = JWT::authenticate()) {
93117               return response()->json([
94118                   'errcode' => 1004,
95                    'errmsg' => '无此用户'
96 
 119                   'errmsg' => '无此用户',
 120
97121               ], 404);
98122           }
99        return $next($request);
100 
101    } catch (TokenExpiredException $e) {
102 
 123          return $next($request);
 124
 125      } catch (TokenExpiredException $e) {
 126
103127           return response()->json([
104128               'errcode' => 1003,
105                'errmsg' => 'token 过期' , //token已过期
 129               'errmsg' => 'token 过期', //token已过期
106130           ]);
107 
 131
108132       } catch (TokenInvalidException $e) {
109 
 133
110134           return response()->json([
111135               'errcode' => 1002,
112                'errmsg' => 'token 无效', //token无效
 136               'errmsg' => 'token 无效', //token无效
113137           ]);
114 
 138
115139       } catch (JWTException $e) {
116 
 140
117141           return response()->json([
118142               'errcode' => 1001,
119                'errmsg' => '缺少token' , //token为空
 143               'errmsg' => '缺少token', //token为空
120144           ]);
121 
 145
122146       }
123147   }
124      ```
125     
 148```
 149    
126150之后再在路由上门引用就可以了。