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位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?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、自行找控制器进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//验证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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//登录 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
1
2
3
4
5
6
7
8
9
10
|
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封装到构造中进行验证【实例化类的时候自动调用构造,构造会在每一个要执行的方法前自动执行】
1
2
3
4
5
6
7
8
9
10
11
12
|
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 ; } } } |
原文链接:https://blog.csdn.net/Your_is_my_God/article/details/118960656
暂无评论内容