jwt 创建和实现


链接下载

composer require lcobucci/jwt 3.3

在extend/tools/jwt创建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
{
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;
}

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

//生成token
$token = Token::createToken($userInfo['id']); //生成token
   $token=$request->get('token');
if(empty($token)){
echo 'token不存在,请登录';die();
}

$result= Token::verifyToken($token);
if(!$result){
echo 'token验证错误(不是本人操作)';die();
}

}
}
 function login() {
var username=$('.username').val();
var password=$('.password').val();
$.ajax({
url:'/login/save',
data:{
username:username,
password:password
},
type:'POST',
dataType:'JSON',
success:function (e){
console.log(e)
if(e.code==200){
var token=e.data.token
localStorage.setItem('token',e.data.token);
window.location.href='/index/create?token='+e.data.token;
}
},
})
}


public function save(Request $request)
{
$params = $this->request->post();
$validate = Loader::validate('Login');

if (!$validate->check($params)) {
dump($validate->getError());
}

$where = [
'username' => $params['username'],
'password' => md5($params['password'])
];

$userInfo = \app\admin\model\Login::where($where)->find();
if (!$userInfo) {
return getJsonData(501,'用户名或密码错误');

}
if ($userInfo['status']==0) {
return getJsonData(502,'用户名被冻结');
}
$token=Token::createToken($userInfo['id']);

$result['token']=$token;
$result['info']=$userInfo;

return getJsonData( 200, '登录成功',$result);

}