- 安装扩展(本项目已安装,无需重复安装):composer require firebase/php-jwt
- 使用:
- 生成token:signToken()
- 验证token:checkToken()
- 具体代码如下,参数可自行定义或修改
/**
* 生成验签
* $uid 用户id
* $key 这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当于加密中常用的盐 salt
*/
function signToken($uid, $type = 'api', $key = '!@#$%*&')
{
$token = array(
"iss" => $key, //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => time(), //签发时间
"nbf" => time(), //在什么时候jwt开始生效 (这里表示生成100秒后才生效)
"exp" => time() + 7200, //token 过期时间
"data" => [ //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
'uid' => $uid,
'login_type' => $type
]
);
$resToken = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
return $resToken;
}
/**
* 验证token
*/
function checkToken($token, $key = '!@#$%*&')
{
$status = array("code" => -1);
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['code'] = 0;
$res['data'] = $arr['data'];
return $res;
} catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg'] = "签名不正确";
return $status;
} catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg'] = "token未生效";
return $status;
} catch (\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg'] = "登录失效";
return $status;
} catch (\Exception $e) { //其他错误
$status['msg'] = "缺少登录凭证";
return $status;
}
}