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‘); }