PHP交流群:294088839
使用 composer 装jwt
composer require firebase/php-jwt
引用 use \Firebase\JWT\JWT;
//签发token
public function signToken($id, $username, $ip){
$key = "wg.xunshankeji.com" . $ip; //秘钥加密关键 Signature
$token = array(
"iss" => "wg.xunshankeji.com", //签发者
"aud" => $ip, //面向的用户
"iat" => time(), //签发时间
"nbf" => time()+3, //在什么时候jwt开始生效
"exp" => time()+79200, //token 过期时间
'data' => [ //自定义信息,不要定义敏感信息
'userid' => $id,
'username' => $username
] //可以用户ID,可以自定义
);
$jwt = JWT::encode($token, $key);
return $jwt;
}
//验证token
public function checkToken($token, $username, $ip){
$key = "wg.xunshankeji.com" . $ip;
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
//获取登录信息
$userInfo = Db::name('promoter')->field('id, nickname, token')->where('nickname',$username)->find();
if($userInfo){
if($arr['data']->username <> $username || $arr['aud'] <> $ip || $token <> $userInfo['token'] ){
return array('status'=>$this->status_code['ERROR_AUTH'], 'msg'=>getMsg('ERROR_AUTH'));
}
return array('status'=>$this->status_code['SUCCESS'], 'msg'=>getMsg('SUCCESS'), 'userid'=> $arr['data']->userid, 'username'=> $arr['data']->username);
} else{
return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_FAIL'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_FAIL'));
}
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
return array('status'=>$this->status_code['ERROR_AUTH'], 'msg'=>getMsg('ERROR_AUTH'));
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_FAIL'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_FAIL'));
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_TIMEOUT'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_TIMEOUT'));
}catch(Exception $e) { //其他错误
return array('status'=>$this->status_code['ERROR_AUTH_TOKEN'], 'msg'=>getMsg('ERROR_AUTH_TOKEN'));
}
}