用户登录 JWT TOKEN

引入 jwt 扩展

安装jwt 扩展

composer require firebase/php-jwt 

直接在 composer.json / require / 下 云行 composer update 更新

 "firebase/php-jwt": "^5.2", 

控制器

  public function login(Request $request)     {         //接收表单参数         $params = input();         // 用来 捕获错误         try {             validate(appvalidateLogin::class)->check($params);         }catch (ValidateException $exception){             return  json(['code'=>1001,'msg'=>$exception->getMessage(),'data'=>'']);         }          $model = User::login($params)->toArray();          if ($model){             $token = Token::MakeToken($model);             return json(['code'=>200,'msg'=>'登录成功','data'=>['user'=>$model,'token'=>$token]]);         }         return json(['code'=>1001,'msg'=>'账号或密码错误','data'=>'']);      }  

封装jwt token

<?php declare (strict_types = 1);  namespace toolsjwt;   use thinkException; use FirebaseJWTJWT; //导入JWT class Token {      /**      * 签发Token      * @param string $key Token签名      * @param array $data 加密的信息      * @return string      */     public static function MakeToken(array $data,string $key = 'key' )     {         //key         $time = time(); //当前时间         $token = [             'iss' => 'http://www.helloweba.net', //签发者 可选             'aud' => 'http://www.helloweba.net', //接收该JWT的一方,可选             'iat' => $time, //签发时间             'nbf' => $time , //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用             'exp' => $time+7200, //过期时间,这里设置2个小时             'data' => $data //自定义信息,不要定义敏感信息          ];         $_token=JWT::encode($token, $key); //输出Token         return $_token;     }      /**      * 解析Token      * @param string $Token 令牌      * @param string $key 签名      * @return array      */     public static function ParseToken(string $Token,string $key='key')     {         //key要和签发的时候一样          $jwt = $Token; //签发的Token         try {             JWT::$leeway = 60;//当前时间减去60,把时间留点余地             $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应             $arr = (array)$decoded; //            print_r($arr);             return $arr;         } catch(FirebaseJWTSignatureInvalidException $e) {  //签名不正确             echo $e->getMessage();         }catch(FirebaseJWTBeforeValidException $e) {  // 签名在某个时间点之后才能用             echo $e->getMessage();         }catch(FirebaseJWTExpiredException $e) {  // token过期             echo $e->getMessage();         }catch(Exception $e) {  //其他错误             echo $e->getMessage();         }         //Firebase定义了多个 throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token     }  }  

创建中间件

php think make:middleware Check 

在public 下的 .htaccess里面加多一项

<IfModule mod_rewrite.c>   Options +FollowSymlinks -Multiviews   RewriteEngine On     RewriteCond %{REQUEST_FILENAME} !-d   RewriteCond %{REQUEST_FILENAME} !-f   RewriteRule ^(.*)$ index.php/?s=$1 [QSA,PT,L]   #增加下面这项   SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 </IfModule> 

编写中间件代码

  public function handle(Request $request, Closure $next)     {         //         $token = $request->header('authorization');         if (!$token) {             return  json(['code'=>1002,'msg'=>'token 验证失败']);         }         //下面的这个判断不存在 只能在laravel里用 tp 没有这个方法         if ($request->bearerToken()){             dd('没有token ,非法请求');die();         }         return $next($request);     } 

控制器引入中间件

    protected $middleware = [Auth::class]; 

**以上若有问题欢迎打扰 **

版权声明:玥玥 发表于 2021-06-12 22:36:11。
转载请注明:用户登录 JWT TOKEN | 女黑客导航