我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

到此这篇关于ThinkPHP5实现JWT Token认证的文章就介绍到这了,更多相关ThinkPHP5 JWT Token认证内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了ThinkPHP5实现JWT Token认证,首先composer先挂载阿里云镜像,安装JWT扩展,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录