JWTtoken怎么在thinkphp框架中使用

JWTtoken怎么在thinkphp框架中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一:JWT介绍:全称JSON Web Token,基于JSON的开放标准((RFC 7519) ,以token的方式代替传统的Cookie-Session模式,用于各服务器、客户端传递信息签名验证。

JWTtoken怎么在thinkphp框架中使用

二:JWT优点:

1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。

2:jwt构成简单,占用很少的字节,便于传输。

3:json格式通用,不同语言之间都可以使用。

三:JWT组成

1:jwt由三部分组成:

头部(header) 载荷(payload) 包含一些定义信息和自定义信息 签证(signature)

2:具体构成:

header:

{
"typ":"JWT",//声明类型为jwt
"alg":"HS256"//声明签名算法为SHA256
}

载荷(payload)

{
"iss":"http://www.helloweba.net",
"aud":"http://www.helloweba.net",
"iat":1525317601,
"nbf":1525318201,
"exp":1525318201,
"data":{
"userid":1,
"username":"李小龙"
}
}

载荷包括两部分:标准声明和其他声明。

标准声明:JWT标准规定的声明,但不是必须填写的;

标准声明字段:

接收该JWT的一方

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,过期时间必须要大于签发时间

nbf: 定义在什么时间之前,某个时间点后才能访问

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token。

下载

composerrequirefirebase/php-jwt

extend 下创建token类

namespaceToken;
usethink\Controller;
usethink\facade\Request;
useFirebase\JWT\JWT;
/**token类
*ClassToken
*@packageapp\api\Controller
*/
classToken
{
/**
*创建token
*@paramarray$data必填自定义参数数组
*@paraminteger$exp_time必填token过期时间单位:秒例子:7200=2小时
*@paramstring$scopes选填token标识,请求接口的token
*@returnstring
*/
private$TokenKey="123456";
publicfunctioncreateToken($data="",$exp_time=0,$scopes=""){
//JWT标准规定的声明,但不是必须填写的;
//iss:jwt签发者
//sub:jwt所面向的用户
//aud:接收jwt的一方
//exp:jwt的过期时间,过期时间必须要大于签发时间
//nbf:定义在什么时间之前,某个时间点后才能访问
//iat:jwt的签发时间
//jti:jwt的唯一身份标识,主要用来作为一次性token。
//公用信息
try{
$key=$this->TokenKey;
$time=time();//当前时间
//$token['iss']='';//签发者可选
//$token['aud']='';//接收该JWT的一方,可选
$token['iat']=$time;//签发时间
$token['nbf']=$time;//(NotBefore):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
if($scopes){
$token['scopes']=$scopes;//token标识,请求接口的token
}
if(!$exp_time){
$exp_time=7200;//默认=2小时过期
}
$token['exp']=$time+$exp_time;//token过期时间,这里设置2个小时
if($data){
$token['data']=$data;//自定义参数
}
$json=JWT::encode($token,$key);
$returndata['status']="200";//
$returndata['msg']='success';
$returndata['token']=$json;//返回的数据
return$returndata;//返回信息
}catch(\Firebase\JWT\ExpiredException$e){//签名不正确
$returndata['status']="104";//101=签名不正确
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
return$returndata;//返回信息
}catch(\Exception$e){//其他错误
$returndata['status']="199";//199=签名不正确
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
return$returndata;//返回信息
}
}
/**
*验证token是否有效,默认验证exp,nbf,iat时间
*@paramstring$jwt需要验证的token
*@returnstring$msg返回消息
*/
publicfunctioncheckToken($jwt){
$key=$this->TokenKey;
try{
JWT::$leeway=60;//当前时间减去60,把时间留点余地
$decoded=JWT::decode($jwt,$key,['HS256']);//HS256方式,这里要和签发的时候对应
$arr=(array)$decoded;
$returndata['status']="200";//200=成功
$returndata['msg']="success";//
$returndata['data']=$arr;//返回的数据
return$returndata;//返回信息
}catch(\Firebase\JWT\SignatureInvalidException$e){//签名不正确
$returndata['status']="101";//101=签名不正确
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
//returnjson_encode($returndata);//返回信息
//exit(json_encode($returndata));
sendResponse($returndata,401,'Unauthorized');
}catch(\Firebase\JWT\BeforeValidException$e){//签名在某个时间点之后才能用
$returndata['status']="102";
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
sendResponse($returndata,401,'Unauthorized');
}catch(\Firebase\JWT\ExpiredException$e){//token过期
$returndata['status']="103";//103=签名不正确
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
sendResponse($returndata,401,'Unauthorized');
}catch(\Exception$e){//其他错误
$returndata['status']="199";//199=签名不正确
$returndata['msg']=$e->getMessage();
$returndata['data']="";//返回的数据
sendResponse($returndata,401,'Unauthorized');
}
//Firebase定义了多个thrownew,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token
}

签发

$jwtToken=newToken();
$tokenData=array(
'openid'=>$user->getId(),
'uniacid'=>$_W['uniacid'],
);
$token=$jwtToken->createToken($tokenData)

验证

if(empty($_SERVER['HTTP_AUTHORIZATION']))
{
$res['status']="201";
$res['msg']="notoken";
$res['data']="";//返回的数据
sendResponse($res,401,'Unauthorized');
}
$token=$_SERVER['HTTP_AUTHORIZATION'];
$jwtToken=newToken();
$checkToken=$jwtToken->checkToken($token);
$data=(array)$checkToken['data']['data'];

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-03-24 01:22:41
收藏
分享
海报
0 条评论
158
上一篇:belongsTo怎么在laravel中使用 下一篇:如何在Laravel中调用原生sql语句
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码