内容简介:了解JWT可以参考:了解JWT一:下载JWT拓展在JWT官网中我们可以看到很多php版本的JWT,选择一个JWT进行下载
了解JWT可以参考:了解JWT
一:下载JWT拓展
在JWT官网中我们可以看到很多 php 版本的JWT,选择一个JWT进行下载
这里我选择的是lcobucci/jwt,使用composer进行下载
lcobucci/jwt的composer地址: https://packagist.org/package...
composer require lcobucci/jwt "^3.3.0" #这里我下载的是3.3.0版本
二:lcobucci/jwt使用
lcobucci/jwt使用方法可以参考下载下来的README.md文件(vendor/lcobucci/jwt/README.md)
1:生成JWT
$request = Yii::$app->getRequest(); $signer = new Sha256();//使用Sha256加密,常用加密方式有Sha256,Sha384,Sha512 $time = time(); $tokenBuilder = (new Builder()) ->issuedBy($request->getHostInfo()) // 设置发行人 ->permittedFor(isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '') // 设置接收 ->identifiedBy(Yii::$app->security->generateRandomString(10), true) // 设置id ->issuedAt($time) // 设置生成token的时间 ->canOnlyBeUsedAfter($time) // 设置token使用时间(实时使用) ->expiresAt($time + 3600); //设置token过期时间 //定义自己所需字段 $user = ['user_name' => '测试', 'user_no' => '001']; $tokenBuilder->withClaim('user', $user); $tokenBuilder->withClaim('ceshi', '测试字段'); //使用Sha256加密生成token对象,该对象的字符串形式为一个JWT字符串 $token = $tokenBuilder->getToken($signer, new Key('jwt_secret')); echo (string) $token;
2:对JWT进行校验
在正常的开发环境下,我们将生成的JWT字符串传到前端,当前端调用其他接口时,将我们所给的JWT传递到后台,我们后台需要对前端传来的JWT字符串进行校验
下面的$token为我们获取到的前端传递的JWT
$token = (new Parser())->parse($token); //数据校验 $data = new ValidationData(); // 使用当前时间来校验数据 if (!$token->validate($data)) { //数据校验失败 return '数据校验失败'; } //token校验 $signer = new Sha256();//生成JWT时使用的加密方式 if (!$token->verify($signer, new Key('jwt_secret'))) { //token校验失败 return 'token校验失败'; } echo '校验成功';
3:获取JWT的相关信息
$token = (new Parser())->parse($token); $token->getHeaders(); // 获取JWT的Header(头部)信息 $token->getClaims(); // 获取JWT的PayLoad(负载)信息 //获取指定参数的PayLoad(负载)信息 $token->getClaim('jti'); $token->getClaim('user');
三:编写一个JWT类,方便对于JWT的使用
1:创建一个JWT类,代码如下:
<?php /** * author: wangjian * date: 2019/6/24 */ namespace app\components; use Lcobucci\JWT\Builder; use Lcobucci\JWT\Claim\Factory as ClaimFactory; use Lcobucci\JWT\Parser; use Lcobucci\JWT\Parsing\Decoder; use Lcobucci\JWT\Parsing\Encoder; use Lcobucci\JWT\Signer\Key; use Lcobucci\JWT\Token; use Lcobucci\JWT\ValidationData; use Yii; use yii\base\Component; use yii\base\InvalidParamException; /** * JWT 通用方法 * Class JWT * @package app\components */ class JWT extends Component { /** * @var array 支持的加密算法 */ public $supportedAlgs = [ 'HS256' => 'Lcobucci\JWT\Signer\Hmac\Sha256', 'HS384' => 'Lcobucci\JWT\Signer\Hmac\Sha384', 'HS512' => 'Lcobucci\JWT\Signer\Hmac\Sha512', ]; /** * 实例化JWT生成器 * @see [[Lcobucci\JWT\Builder::__construct()]] * @return Builder */ public function getBuilder(Encoder $encoder = null, ClaimFactory $claimFactory = null) { return new Builder($encoder, $claimFactory); } /** * 实例化JWT分析器 * @see [[Lcobucci\JWT\Parser::__construct()]] * @return Parser */ public function getParser(Decoder $decoder = null, ClaimFactory $claimFactory = null) { return new Parser($decoder, $claimFactory); } /** * 验证JWT并返回一个令牌类 * function: ValiJwt * @return Token|null */ public function ValiJwt($token, $validate = true, $verify = true) { try { $token = $this->getParser()->parse((string)$token); } catch (\RuntimeException $e) { // Yii::warning("Invalid JWT provided: " . $e->getMessage(), 'jwt'); return null; } catch (\InvalidArgumentException $e) { // Yii::warning("Invalid JWT provided: " . $e->getMessage(), 'jwt'); return null; } if ($validate && !$this->validateToken($token)) { return null; } if ($verify && !$this->verifyToken($token)) { return null; } return $token; } /** * 数据验证 * Validate token * @param Token $token token object * @return bool */ public function validateToken(Token $token, $currentTime = null) { $data = new ValidationData($currentTime); // @todo Add claims for validation return $token->validate($data); } /** * Validate token * @param Token $token token object * @return bool */ public function verifyToken(Token $token) { $alg = $token->getHeader('alg'); if (empty($this->supportedAlgs[$alg])) { throw new InvalidParamException('Algorithm not supported'); } $signer = Yii::createObject($this->supportedAlgs[$alg]); return $token->verify($signer, new Key('jwt_secret')); } }
2:在配置文件中添加(引入JWT类):
'components' => [ ... 'jwt' => [ 'class' => 'app\components\Jwt' ], ... ]
3:使用:
Yii::$app->jwt Yii::$app->jwt->getBuilder() #等同于new Builder() Yii::$app->jwt->ValiJwt($token);JWT验证
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
基于内容图像检索技术
周明全 / 清华大学 / 2007-12 / 28.00元
《基于内容图像检索技术》从理论方法研究与实现技术角度,总结归纳了基于内容图像检索(CBIR)技术的研究与进展,并融入了作者多年来的相关研究与应用成果,系统地介绍了CBIR的主要概念、基本原理、典型方法、实用范例以及新动向。《基于内容图像检索技术》共有12章分为五部分:第一部分是概述,分析了CBIR的体系结构、技术现状和发展趋势;第一部分讨论图像特征提取,给出图像低层特征(颜色、形状、纹理、空间关系......一起来看看 《基于内容图像检索技术》 这本书的介绍吧!