当前位置: 首页 > 后端技术 > PHP

Yii使用JWT

时间:2023-03-29 22:42:56 PHP

了解JWT可以参考:了解JWT1:下载JWT扩展在JWT官网上可以看到很多php版本的JWT,选择一个JWT下载这里我选择lcobucci/jwt,使用composer下载lcobucci/jwtcomposer地址:https://packagist.org/package...composerrequirelcobucci/jwt"^3.3.0"#这里我下载的是3.3.02版本:lcobucci/jwt使用lcobucci/jwt可以参考下载方法README.md文件(vendor/lcobucci/jwt/README.md)1:生成JWT$request=Yii::$app->getRequest();$signer=newSha256();//使用Sha256加密,常用的加密方式有分别是Sha256、Sha384、Sha512$time=time();$tokenBuilder=(newBuilder())->issuedBy($request->getHostInfo())//设置发行者->permittedFor(isset($_SERVER['HTTP_ORIGIN'])?$_SERVER['HTTP_ORIGIN']:'')//setreceiving->identifiedBy(Yii::$app->security->generateRandomString(10),true)//setid->issuedAt($time)//设置生成令牌的时间->canOnlyBeUsedAfter($time)//设置token使用时间(实时使用)->expiresAt($time+3600);//设置token过期时间//定义你需要的Field$user=['user_name'=>'test','user_no'=>'001'];$tokenBuilder->withClaim('user',$user);$tokenBuilder->withClaim('ceshi','testfield');//使用Sha256加密生成token对象,字符串形式为JWT字符串$token=$tokenBuilder->getToken($signer,newKey('jwt_secret'));回声(字符串)$令牌;2:验证JWT在正常的开发环境中,我们将生成的JWT字符串传递给前端,当前端调用其他接口时,我们将我们给到的JWT传递给后台,我们后台需要验证发送的JWT字符串从前端。下面的$token是我们获取到的前端传递过来的JWT$token=(newParser())->parse($token);//数据校验$data=newValidationData();//使用当前时间验证数据if(!$token->validate($data)){//数据验证失败return'datavalidationfailed';}//tokenvalidation$signer=newSha256();//加密生成JWT时使用的方法if(!$token->verify($signer,newKey('jwt_secret'))){//令牌验证失败return'令牌验证失败';}echo'验证成功';3:获取JWT相关信息$token=(newParser())->parse($token);$token->getHeaders();//获取JWTHeader(headerPart)信息$token->getClaims();//获取JWT的PayLoad(load)信息//获取指定参数的PayLoad(load)信息$token->getClaim('jti');$token->getClaim('用户');三:写一个JWT类,方便JWT的使用1:创建一个JWT类,代码如下:'Lcobucci\JWT\Signer\Hmac\Sha256','HS384'=>'Lcobucci\JWT\Signer\Hmac\Sha384','HS512'=>'Lcobucci\JWT\Signer\Hmac\Sha512',];/***实例化JWT生成器*@see[[Lcobucci\JWT\Builder::__construct()]]*@returnBuilder*/publicfunctiongetBuilder(Encoder$encoder=null,ClaimFactory$claimFactory=null){return新生成器($编码器,$claimFactory);}/***实例化JWT分析器*@see[[Lcobucci\JWT\Parser::__construct()]]*@returnParser*/publicfunctiongetParser(Decoder$decoder=null,ClaimFactory$claimFactory=null){returnnewParser($decoder,$claimFactory);}/***指定默认JWT作为默认值*function:ValiJwt*@returnToken|null*/publicfunctionValiJwt($token,$validate=true,$verify=true){try{$token=$this->getParser()->解析((string)$token);}catch(\RuntimeException$e){//Yii::warning("提供的JWT无效:".$e->getMessage(),'jwt');返回空值;}catch(\InvalidArgumentException$e){//Yii::warning("提供的JWT无效:".$e->getMessage(),'jwt');返回空值;}if($validate&&!$this->validateToken($token)){returnnull;}if($verify&&!$this->verifyToken($token)){returnnull;}返回$令牌;}/***验证令牌*@paramToken$token令牌对象*@returnbool*/publicfunctionvalidateToken(Token$token,$currentTime=null){$data=newValidationData($currentTime);//@todo添加验证声明return$token->validate($data);}/***验证令牌*@paramToken$token令牌对象*@returnbool*/publicfunctionverifyToken(Token$token){$alg=$token->getHeader('alg');if(empty($this->supportedAlgs[$alg])){thrownewInvalidParamException('不支持算法');$signer=Yii::createObject($this->supportedAlgs[$alg]);return$token->verify($signer,newKey('jwt_secret'));}}2:指定特定类型(名称JWT):'components'=>[...'jwt'=>['class'=>'app\components\Jwt'],...]3:默认值:Yii::$app->jwtYii::$app->jwt->getBuilder()#CreateNewBuilder()Yii::$app->jwt->ValiJwt($token);JWT验证