bourse stock
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.7 KiB

<?php
namespace app\utility;
use think\facade\Cache;
class Jwt
{
/**
* @desc 生成token
* @param $userId // 用户id
* @param $key // 前后台不一致的key
* @return string
*/
public function getToken($userId, $key): string
{
$payload = [
'data' => [
'userId' =>$userId
],
'iss' => 'qwueiqnyuqjezchiw', // 随机
'aud' => '',
'iat' =>time()
];
return 'Bear' . \Firebase\JWT\JWT::encode($payload, $key, 'HS256');
}
/**
* 后端生成token
* @param $userId // 用户id
* @return string
*/
function generateToken($userId)
{
//获取当前时间戳
$currentTime = time();
$data = array(
"iss" => 'coinwerqwerasdf', //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => $currentTime, //签发时间
"nbf" => $currentTime, //立马生效
"exp" => $currentTime + 3600*24, //token 过期时间 1天
"data" => [ //记录的userid的信息
'user_id' => $userId,
]
);
//生成token
$token = \Firebase\JWT\JWT::encode($data, env('ENCRYPT.ADMINSALT'), "HS256");
return 'Bear'.$token;
}
/**
* 检查token有效性
* @param $token
* @return array|int[]
*/
public function chekToken($token)
{
$status=array("code"=>2);
if(!$token){
$status['msg']="token缺失";
return $status;
}
$len=4;
$bear=substr($token,0,6);
if($bear=='Bearer'){
$len=6;
}
$token = trim(substr_replace($token,'',0,$len)," ");
try {
\Firebase\JWT\JWT::$leeway = 60;//当前时间减去60
$decoded = \Firebase\JWT\JWT::decode($token, new \Firebase\JWT\Key(env('ENCRYPT.ADMINSALT'), 'HS256'));
$arr = (array)$decoded;
$res['code']=1;
$res['data']=$arr['data'];
return $res;
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg']="token签名不正确";
return $status;
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg']="token失效";
return $status;
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg']="token失效";
return $status;
}catch(\Exception $e) { //其他错误
$status['msg']="未知错误";
return $status;
}
}
}