基于jwt实现tp6 api的权限控制

--jwt 是面向离线认证设计的接口权限验证插件
--是生成token->验证token的一套流程

/lib/jwt.php

<?php
declare (strict_types = 1);
namespace app\common\lib;
use Exception;
use \Firebase\JWT\JWT;
// 使用jwt加密和解密token
class Auth{
    public static function signToken($uid){
        $key = md5('my_salt');         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt
        $token=array(
            "iss"=>'',        //签发者 可以为空
            "aud"=>'',          //面象的用户,可以为空
            "iat"=>time(),      //签发时间
            "nbf"=>time(),    //在什么时候jwt开始生效  (这里表示生成100秒后才生效)
            "exp"=> time()+20, //token 过期时间
            "data"=>[           //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                'uid'=>$uid,
            ]
        );
        //  print_r($token);
        $jwt = JWT::encode($token, $key);  //根据参数生成了 token
        return $jwt;
    }
    
    //验证token
    public static function checkToken($token){
        $key = md5('my_salt');
        try {
            $decoded = json_decode(json_encode(JWT::decode($token, $key, ['HS256'])), true);  //HS256方式,这里要和签发的时候对应
            return $decoded;
        }catch(Exception $e) { //其他错误
            return false;
        }
    }
}

route/app.php

Route::group('/jwt', function () {
    Route::rule('/product', 'jwt.jwt/product', 'POST');
    Route::rule('/test', 'jwt.jwt/test', 'POST')->middleware(Jwt::class);
});

middleware/jwt.php

<?php

namespace app\admin\middleware;

use Exception;
use app\common\lib\Auth;
use app\common\lib\Redis;
class Jwt
{
    public function handle($request, \Closure $next){
        // 中间件验证token
        $accessToken = $request->header('access-token');
        if(!$accessToken){
            throw new Exception('请传入token');
        }
        $res = Auth::checkToken($accessToken);
        if(!$res){
            throw new Exception('jwttoken验证失败');
        }
        var_dump($res);
        return $next($request);
    }
}

posted @ 2020-09-25 16:38  cl94  阅读(2078)  评论(0编辑  收藏  举报