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认证内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

ThinkPHP5实现JWT Token认证的过程(亲测可用)的更多相关文章

  1. 如何使用iOS SDK保存LinkedIn访问令牌?

    我在我的iOS应用程序中使用LinkedIn.我想保存访问令牌以供将来使用.令牌属于非属性类型,无法直接保存在NSUserDefaults中.我尝试使用NSKeyedArchiver,但我得到了输出:令牌中的文本即将到来,但值将为空.代码段1:我也尝试像这样保存,但结果是一样的:代码段2:我的编码或访问令牌有什么问题需要一些特殊技术来保存吗?请建议.解决方法这就是我拯救的方式.它对我有用.希望它有所帮助以这种方式使用保存的responseBody我希望这次我很清楚

  2. IOS Facebook身份验证使用node.js passport-facebook-token

    我正在尝试使用来自IOS应用程序的passport-facebook-token对node.jsapi进行身份验证.我有用户名和密码验证设置,并通过护照和护照-facebook-token设置正常工作.我只是无法弄清楚将访问令牌发送到API所需的HTTP请求语法.任何帮助都将受到大力赞赏.谢谢.解决方法确定设法从passport-facebook-token的策略文件中找出答案这个需要:http://URL?access_token=[访问令牌]从IOS我只是用以下方法测试:希望这有助于其他人.

  3. 解析条纹iOS main.js

    我真的很难让ParseStripe在我的项目中工作.此时,我想要最简单的工作版本,允许我向用户收费.我找到答案的最接近的事情如下:SimplestExampleI’veFound当我使用上面链接中的更正代码时,我的秘密得到以下错误:请帮助=**(这太令人沮丧了.————-更新—————-其他一些帖子也有类似的错误,看起来最新版本的ParseCloud代码应该归咎于:1.6.0.在控制台视图中使用以

  4. 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析

    一,总体架构1,引入第三方库除了必须引入对应的登录SDK外,额外引入了SDWebImage,SVProgressHUD,看名字大家都明白吧,引入登录SDK请各自看官方的开发文档,需要加入什么系统库文件,需要配置OtherLinkerFlags等,请参考各自官方文档即可;2,配置连接桥文件因为创建的工程是基于Swift语言,目前官方SDK和其它三方库都是用OC写的,所以为了在swift中调用oc代码

  5. 基于Swift语言开发微信、QQ跟微博的SSO授权登录代码分析

    转自:http://www.myexception.cn/swift/1991018.html前言Swift语言,怎么说呢,有一种先接受后排斥,又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift几乎占据了多半,而国内虽然出现很多相关技术介绍和教程,但是在真正项目开发中使用的占据很少部分,原因一是目前熟练它的开发者并不多,二是版本不太稳定,还需要更成熟可靠的版本支持,但总之未来还是很有前景的,

  6. Swift3 单例模式

    常见的有这么几种方法第一种最简单也是最常用的,这里的所有单例init方法一定要定义成private的,不然外部依然可以使用init方法初始化变量。final关键字的作用是这个类或方法不希望被继承和重写第二种第二种完全是OC风格的单例,但是由于Swift3中废弃了原来的dispatch_once_t,所以需要先给dispatchQueue添加一个extension,实现原先的dispatch_once_t效果第三种第四种在方法内定义静态变量

  7. 微信三方登录相关(Swift)

    微信登录条件1.微信开放平台注册并认证成功2.相关应用的微信的APPID和secret3.遵循微信代理WXApiDelegate使用处编写相关登录代码WXApi.registerappletreq=SendAuthReq.init()req.scope="snsapi_userinfo"req.state="wulianwang"WXApi.send在回调方法中处理相关业务funconResp(_resp:BaseResp!,options:.mutableContainers)/**正确时返回的JSON

  8. 如何替换位置代码使Swift 3兼容?

    我有以下类,它有方法getNextToken迭代数组项:但我有一个来自编译器的警告消息,将在Swift3中弃用我应该如何重写我的代码让方法在当前位置返回数组项并在此之后增加位置?添加一个行位置=1的标准建议不适合这里,因为我在评估令牌时正在退出范围[位置]延迟可用于增加位置变量在计算返回值之后:

  9. 如何使用Swift检查iOS设备是否被锁定/解锁?

    如何使用Swift检测锁定/解锁的iOS设备(如Android中的SCRENON/SCREENOFF)我使用以下来创建相同的想法.您需要使用桥接器将目标c代码用于swift.HereistheLinkforcreatethebridgebetweentheObjectivectoSwift.完成后,您可以将以下.h文件添加到您的项目–桥接–标题中.文件添加yourcontroller.h然后将No

  10. 如何在Swift中执行一次代码只执行一次?

    到目前为止我所看到的答案建议使用GCD的dispatch_once:输出:但等一下.token是一个变量,所以我可以很容易地做到这一点:输出:因此,如果我可以更改令牌的值,dispatch_once是没用的!有一种更安全的方式只执行一次代码吗?由闭包初始化的静态属性是懒惰运行的,最多只运行一次,所以这只打印一次,尽管被调用了两次:示例运行:

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部