搜索

查看: 3202|回复: 11

[PHP] ThinkPHP5实现JWT Token认证的过程(亲测可用)

[复制链接]
发表于 2023-5-4 17:06:48 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:06:48 3202 11 看全部
1、composer先挂载阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

2、安装JWT扩展
composer require lcobucci/jwt 3.3

3、在vendor目录中打开readme.md文件

2022101314433471.png

ThinkPHP5实现JWT Token认证的过程(亲测可用)9503 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


4、在extend目录中,自定义类进行JWT操作生成token

2022101314433472.png

ThinkPHP5实现JWT Token认证的过程(亲测可用)8372 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


5、操作Token.php实现生成token的方法,详细在readme.md中的Hmac位置
issuedBy( issuer: "fanxinze')//配置发行人
                        ->canonlyBeUsedBy( audience: " user')//配置接收人
                        ->identifiedBy( id: ' quanzhankaifa',replicateAsHeader: true)//标题id->issuedAt($time)//发出token令牌的时间
                        ->canonlyBeUsedAfter( notBefore: $time + 60)//生效时间->expiresAt( expiration: $time + 3600)//过期时间
                        ->with( name: " uid' , $uid)//用户id
                        ->sign($signer, key: ' 1902a" )//签名内容->getToken(;//获取token
                return (string)$token;
        }
}
注意:生效时间+60表示1分钟后生效,可以去掉加法运算,表示即时生效

2022101314433473.jpg

ThinkPHP5实现JWT Token认证的过程(亲测可用)9255 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


6、自行找控制器进行测试

2022101314433474.jpg

ThinkPHP5实现JWT Token认证的过程(亲测可用)3743 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


7、最终会得到结果类似如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k

8、封装验证Token的方法,如果失败返回false,如果成功返回用户id
//验证token
static public function verifyToken($token=null){
        //检测是否接收到了token
        if(empty($token)){
                return 0;
        }
        //代码到50行,就表示取到token了,那么转化成jwt认识的token
        $token = (new Parser())->parse((string) $token);
        //验证基本设置
        $data = new ValidationData();
        $data->setIssuer( issuer: "teacher ' );
        $data->setAudience( audience: 'student ' );$data->setId( id: " quanzhan ' );
        if(!$token->validate($data)){
                return 0;
        }
        //验证签名
        $signer = new sha256();
        if(!$token->verify($signer, key: ' 1902a' )){
        return 0;
        }
        //验证通过,返回用户id
        return $token->getclaim( name:'uid');
}

2022101314433475.jpg

ThinkPHP5实现JWT Token认证的过程(亲测可用)527 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


9、案例:Token在实际代码中的应用
注意:这里为了简单的做测试,使用的是DB操作,但是在实际代码中不建议使用DB,必须使用MVC进行开发。
(1)、登录的时候生成token
//登录
public function login(){
        $data = input();
        array_shift( &array: $data);if(empty($data[ ' username ' ])){
                return json([ 'code'=>1, ' msg'=>'用户名不能为空' , ' result'=>null]);
        }
        if(empty($data[ ' password' ])){
                return json([ 'code '=>2, ' msg'=>'密码不能为空', ' result'=>null]);
        }
        $data[ " password ' ] = md5($data[ ' password ' ]);
        $info = Db ::table( table: 'tpshop_manager ')->where($data)->find();
        if(!$info){
                return json( [ 'code '=>3 , ' msg'=>'账号密码有误', ' result'=>null]);
        }
        //登录成功
        //生成token
        $token = Token : : createToken($info[ 'id' ]);
        $info[ 'token' ] = $token;
        return json([ ' code '=>0, ' msg'=>'登录成功", ' result'=>$info]);
}

2022101314433476.jpg

ThinkPHP5实现JWT Token认证的过程(亲测可用)1010 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


(2)、登录后可以拿到token,然后请求其他接口的时候就验证token是否正确,如果不正确,提示无效的token
public function index()
{
        $token = input(key: 'token') ;
        $res = Token::verifyToken($token);
        if($res==0){
                return json([ 'code'=>1, 'msg '=>'无效的Token " , "result'=>null]);
        }
        $data = Db::table(table: "'tpshop_manager" )->paginate(listRows: 7);
        return json([ " code '=>0, ' msg'=>'成功", "result'=>$data]);
}

2022101314433477.png

ThinkPHP5实现JWT Token认证的过程(亲测可用)6379 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


(3)、由于登录后的每一个方法可能都需要验证token,所以我们把token封装到构造中进行验证【实例化类的时候自动调用构造,构造会在每一个要执行的方法前自动执行】
class Base extends controller
{
    public function _construct(Request $request = null)
        {
        $token = $request->param( name: "token " );$res = Token : :verifyToken($token) ;
        if($res==0){
                $arr = [ ' code'=>1, 'msg'=>'无效的Token " , ' result'=>null];
                echo json_encode($arr);
                die;
        }
    }
}

20221025215936.png

ThinkPHP5实现JWT Token认证的过程(亲测可用)2142 作者:Editor 帖子ID:2990 论坛知鸟论坛_zn60.com


到此这篇关于ThinkPHP5实现JWT Token认证的文章就介绍到这了,更多相关ThinkPHP5 JWT Token认证内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛!
发表于 2023-6-29 00:17:59 | 显示全部楼层
dxf17 2023-6-29 00:17:59 看全部
楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
发表于 2023-6-29 10:03:34 | 显示全部楼层
哈哈SE7 2023-6-29 10:03:34 看全部
楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
发表于 2023-6-29 14:10:47 | 显示全部楼层
123456819 2023-6-29 14:10:47 看全部
既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
发表于 2023-6-29 17:06:07 | 显示全部楼层
伊索谗言 2023-6-29 17:06:07 看全部
我看不错噢 谢谢楼主!知鸟论坛越来越好!
发表于 2023-6-30 01:47:02 | 显示全部楼层
当当当当裤裆坦 2023-6-30 01:47:02 看全部
楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
发表于 2023-6-30 09:25:42 | 显示全部楼层
风吹吹蛋蛋疼风w 2023-6-30 09:25:42 看全部
我看不错噢 谢谢楼主!知鸟论坛越来越好!
发表于 2023-6-30 09:41:32 | 显示全部楼层
123456833 2023-6-30 09:41:32 看全部
感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
发表于 2023-6-30 10:07:44 | 显示全部楼层
塞翁364 2023-6-30 10:07:44 看全部
楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
发表于 2023-6-30 18:43:03 | 显示全部楼层
Gordon520 2023-6-30 18:43:03 看全部
我看不错噢 谢谢楼主!知鸟论坛越来越好!
  • 您可能感兴趣
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

RSS订阅| 小黑屋| 知鸟论坛 |网站地图
本站资源来自互联网用户收集发布,如有侵权请邮件联系处理。 联系邮箱E-mail:zniao@foxmail.com
快速回复 返回顶部 返回列表