ThinkPHP5 使用 JWT 進行加密

RainCyan發表於2019-08-16

-使用Github的firebase\JWT
-使用Composer安裝此擴充套件
-程式碼示例

<?php
/**
 * [InterCommon-介面公用]
 * @Author   RainCyan
 * @DateTime 2019-08-12T16:38:08+0800
 */
namespace app\hladmin\controller;
use think\Controller;
use \Firebase\JWT\JWT;
class InterCommonController extends Controller {
    private $key = "123456789";

    //客戶端獲取TOKEN
    public function _getJwtToken(){
        try {
            $string = input("string");
            if (empty($string)) {
                throw new \Exception("請傳入需要加密string", -105);
            }
            $jwt = $this->_setJwtToken($string);
            throw new \Exception($jwt, 200);
        } catch (\Exception $e) {
            return json(array("code"=>$e->getCode(), "msg"=>$e->getMessage()));
        }
    }
    //簽發token
    private function _setJwtToken($string=""){
        $key = $this->key;
        $time = time();
        $token = array(
            "iss" => "http://ml.cn",
            "aud" => "http://ml.cn",
            'iat' => $time, //簽發時間
            'nbf' => $time + 10, //在什麼時間之後該jwt才可用
            'exp' => $time + 10, //過期時間
            "string" => $string
        );
        $jwt = JWT::encode($token, $key);
        return $jwt;
    }

    //解析token
    protected function _readJwtToken($jwt){
        $key = $this->key;
        try {
            JWT::$leeway = 60;//當前時間減去60,把時間留點餘地
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,這裡要和簽發的時候對應
            $arr = (array)$decoded;
            return json_msg(200, "success", $arr);
        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //簽名不正確
            return json_msg(-101, $e->getMessage());
        }catch(\Firebase\JWT\BeforeValidException $e) {  // 簽名在某個時間點之後才能用
            return json_msg(-102, $e->getMessage());
        }catch(\Firebase\JWT\ExpiredException $e) {  // token過期
            return json_msg(-103, $e->getMessage());
        }catch(Exception $e) {  //其他錯誤
            return json_msg(-104, $e->getMessage());
        }
    }
    //測試解析
    public function _writeJwtToken($token){
        halt($this->_readJwtToken($token));
    }
}
?>

相關文章