1、composer先挂载阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2、安装JWT扩展
composer require lcobucci/jwt 3.3
3、在vendor目录中打开readme.md文件
4、在extend目录中,自定义类进行JWT操作生成token
5、操作Token.php实现生成token的方法,详细在readme.md中的Hmac位置
<?php use Lcobucci\\JWT\\Builder; use Lcobucci\\JWT\\signer\\Hmac\\Sha256; class Token{ //自定义一个生成token的方法 static public function createToken($uid = null){ $signer = new Sha256(;//加密算法 $time = time(;//当前的时间戳 $token = (new Builder()) ->issuedBy( issuer: \"fanxinze\')//配置发行人 ->canonlyBeUsedBy( audience: \" user\')//配置接收人 ->identifiedBy( id: \' quanzhankaifa\',replicateAsHeader: true)//标题id->issuedAt($time)//发出token令牌的时间 ->canonlyBeUsedAfter( notBefore: $time + 60)//生效时间->expiresAt( expiration: $time + 3600)//过期时间 ->with( name: \" uid\' , $uid)//用户id ->sign($signer, key: \' 1902a\" )//签名内容->getToken(;//获取token return (string)$token; } }
注意:生效时间+60表示1分钟后生效,可以去掉加法运算,表示即时生效
6、自行找控制器进行测试
<?php namespace app\\index\\controller; use think\\Controller; use Token; class Index extends Controller { public function index() { $token = Token : : createToken(); return $token; } }
7、最终会得到结果类似如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k
8、封装验证Token的方法,如果失败返回false,如果成功返回用户id
//验证token static public function verifyToken($token=null){ //检测是否接收到了token if(empty($token)){ return 0; } //代码到50行,就表示取到token了,那么转化成jwt认识的token $token = (new Parser())->parse((string) $token); //验证基本设置 $data = new ValidationData(); $data->setIssuer( issuer: \"teacher \' ); $data->setAudience( audience: \'student \' );$data->setId( id: \" quanzhan \' ); if(!$token->validate($data)){ return 0; } //验证签名 $signer = new sha256(); if(!$token->verify($signer, key: \' 1902a\' )){ return 0; } //验证通过,返回用户id return $token->getclaim( name:\'uid\'); }
9、案例:Token在实际代码中的应用
注意:这里为了简单的做测试,使用的是DB操作,但是在实际代码中不建议使用DB,必须使用MVC进行开发。
(1)、登录的时候生成token
//登录 public function login(){ $data = input(); array_shift( &array: $data);if(empty($data[ \' username \' ])){ return json([ \'code\'=>1, \' msg\'=>\'用户名不能为空\' , \' result\'=>null]); } if(empty($data[ \' password\' ])){ return json([ \'code \'=>2, \' msg\'=>\'密码不能为空\', \' result\'=>null]); } $data[ \" password \' ] = md5($data[ \' password \' ]); $info = Db ::table( table: \'tpshop_manager \')->where($data)->find(); if(!$info){ return json( [ \'code \'=>3 , \' msg\'=>\'账号密码有误\', \' result\'=>null]); } //登录成功 //生成token $token = Token : : createToken($info[ \'id\' ]); $info[ \'token\' ] = $token; return json([ \' code \'=>0, \' msg\'=>\'登录成功\", \' result\'=>$info]); }
(2)、登录后可以拿到token,然后请求其他接口的时候就验证token是否正确,如果不正确,提示无效的token
public function index() { $token = input(key: \'token\') ; $res = Token::verifyToken($token); if($res==0){ return json([ \'code\'=>1, \'msg \'=>\'无效的Token \" , \"result\'=>null]); } $data = Db::table(table: \"\'tpshop_manager\" )->paginate(listRows: 7); return json([ \" code \'=>0, \' msg\'=>\'成功\", \"result\'=>$data]); }
(3)、由于登录后的每一个方法可能都需要验证token,所以我们把token封装到构造中进行验证【实例化类的时候自动调用构造,构造会在每一个要执行的方法前自动执行】
class Base extends controller { public function _construct(Request $request = null) { $token = $request->param( name: \"token \" );$res = Token : :verifyToken($token) ; if($res==0){ $arr = [ \' code\'=>1, \'msg\'=>\'无效的Token \" , \' result\'=>null]; echo json_encode($arr); die; } } }
暂无评论内容