PHP使用jwt庫 (一般用於api驗籤,基於TP5)
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'));
}
}