TP5.0实现jwt的创建和验证
composer 安装jwt
composer require lcobucci/jwt 3.3
在extend/tools/jwt创建Token.php
注意:框架本身的extend 的目录下是没有文件夹的 需要自己创建
在Token.php 完成如下代码:
<?php
namespace tools\jwt;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData;
class Token
{
/**
* 生成token
* @param null $uid
* @return string
*/
public static function createToken($uid = null)
{
$signer = new Sha256();//加密规则
$time = time();//当前时间
$token = (new Builder())
->issuedBy('teacher')//签发人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //标题id
->issuedAt($time)//发出令牌的时间
->canOnlyBeUsedAfter($time) //生效时间(即时生效)
->expiresAt($time + 3600) //过期时间
->with('uid', $uid) //用户id
->sign($signer, 'my') //签名
->getToken(); //得到token
return (string)$token;
}
/**
*
* 解密 验证token
* @param null $token
* @return int|mixed
*/
public static function verifyToken($token = null)
{
//检测是否接收到了token
if (empty($token)) {
return 0;
}
//转化为可以验证的token
$token = (new Parser())->parse((string)$token);
//验证基本设置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei');
if (!$token->validate($data)) {
return 0;
}
//验证签名
$signer = new Sha256();
if (!$token->verify($signer, 'my')) {
return 0;
}
//验证通过,返回用户id
return $token->getClaim('uid');
}
}
?>
生成token
public static function createToken($uid = null)
{
$signer = new Sha256();//加密规则
$time = time();//当前时间
$token = (new Builder())
->issuedBy('teacher')//签发人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //标题id
->issuedAt($time)//发出令牌的时间
->canOnlyBeUsedAfter($time) //生效时间(即时生效)
->expiresAt($time + 3600) //过期时间
->with('uid', $uid) //用户id
->sign($signer, 'my') //签名
->getToken(); //得到token
return (string)$token;
}
验证token
public static function verifyToken($token = null)
{
//检测是否接收到了token
if (empty($token)) {
return 0;
}
//转化为可以验证的token
$token = (new Parser())->parse((string)$token);
//验证基本设置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei');
if (!$token->validate($data)) {
return 0;
}
//验证签名
$signer = new Sha256();
if (!$token->verify($signer, 'my')) {
return 0;
}
//验证通过,返回用户id
return $token->getClaim('uid');
}
在控制器里面如何的生成token
先要将创建的文件引入控制器中
use tools\jwt\Token;
然后登录成功时生成token 并传到前端
//生成token
$token = Token::createToken($result['id']); //这里的$result 是登录查询返回的数组
eturn json(['code'=>200,'message'=>'success','data'=>$token]);
在前端保存到本地cookie 和如何取出
localStorage.setItem('token',res.data)//res 是值前端发送Ajax请求成功后的回调函数的形参
localStorage.getItem('token') //获取本地的token
在控制器里面验证
if (empty($token)){
$this->error('缺少token参数','admin/login/login');
}
$res = Token::verifyToken($token);
if($res==0){
$this->error('token失效','admin/login/login');
}
tp5.0 实现登录在 https://www.cnblogs.com/gj210623/p/15218940.html