閃電 发表于 2023-1-3 07:18:33

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

1、composer先挂载阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/2、安装JWT扩展
composer require lcobucci/jwt 3.33、在vendor目录中打开readme.md文件
https://img.jbzj.com/file_images/article/202210/2022101314433471.png
4、在extend目录中,自定义类进行JWT操作生成token
https://img.jbzj.com/file_images/article/202210/2022101314433472.png
5、操作Token.php实现生成token的方法,详细在readme.md中的Hmac位置
<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\signer\Hmac\Sha256;

class Token{
        //自定义一个生成token的方法
        static public function createToken($uid = null){
                $signer = new Sha256(;//加密算法
                $time = time(;//当前的时间戳
                $token = (new Builder())
                        ->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分钟后生效,可以去掉加法运算,表示即时生效
https://img.jbzj.com/file_images/article/202210/2022101314433473.jpg
6、自行找控制器进行测试
<?php
namespace app\index\controller;
use think\Controller;
use Token;

class Index extends Controller
{
        public function index()
        {
        $token = Token : : createToken();
        return $token;
        }
}https://img.jbzj.com/file_images/article/202210/2022101314433474.jpg
7、最终会得到结果类似如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k8、封装验证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');
}https://img.jbzj.com/file_images/article/202210/2022101314433475.jpg
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]);
}https://img.jbzj.com/file_images/article/202210/2022101314433476.jpg
(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]);
}https://img.jbzj.com/file_images/article/202210/2022101314433477.png
(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;
        }
    }
}https://img.jbzj.com/file_images/article/202210/20221025215936.png
到此这篇关于ThinkPHP5实现JWT Token认证的文章就介绍到这了,更多相关ThinkPHP5 JWT Token认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/264971.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ThinkPHP5实现JWT Token认证的过程(亲测可用)