ThinkPHP5实现JWT Token认证的过程(亲测可用)

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文件

ThinkPHP5实现JWT Token认证的过程(亲测可用)

4、在extend目录中,自定义类进行JWT操作生成token

ThinkPHP5实现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分钟后生效,可以去掉加法运算,表示即时生效

ThinkPHP5实现JWT Token认证的过程(亲测可用)

6、自行找控制器进行测试

<?php
namespace app\\index\\controller;
use think\\Controller;
use Token;

class Index extends Controller
{
	public function index()
	{
	$token = Token : : createToken();
	return $token;
	}
}

ThinkPHP5实现JWT 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\');
}

ThinkPHP5实现JWT Token认证的过程(亲测可用)

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

ThinkPHP5实现JWT Token认证的过程(亲测可用)

(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]);
}

ThinkPHP5实现JWT Token认证的过程(亲测可用)

(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;
	}
    }
}

ThinkPHP5实现JWT Token认证的过程(亲测可用)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容