Subversion Repositories php-qbpwcf

Rev

Rev 226 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

/*

        QBPWCF, Quick Build PHP website Component base on Fedora Linux.
    Copyright (C) 2014~2026 MIN ZHI, CHEN

    This file is part of QBPWCF.

    QBPWCF is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    QBPWCF is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.

*/
namespace qbpwcf;

/*
類別說明:
jwt應用的類別.
備註:
無.
*/
class jwt{

        /*
        #函式說明:
        #當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$reuslt["error"],執行不正常結束的錯訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #必填參數:
        #$method,物件,為物件實體或類別名稱,會自動置入該參數.
        #$arguments,陣列,為呼叫方法時所用的參數.
        #參考資料:
        #__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
        */
        public function __call($method,$arguments){

                #取得當前執行的函式
                $result["function"]=__FUNCTION__;

                #設置執行不正常
                $result["status"]="false";

                #設置執行錯誤
                $result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";

                #設置所丟入的參數
                $result["error"][]=$arguments;

                #回傳結果
                return $result;

                }#function __call end

        /*
        #函式說明:
        #當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$reuslt["error"],執行不正常結束的錯訊息陣列.
        #$result["function"],當前執行的函式名稱.
        #必填參數:
        #$method,物件,為物件實體或類別名稱,會自動置入該參數.
        #$arguments,陣列,為呼叫方法時所用的參數.
        #參考資料:
        #__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
        */
        public static function __callStatic($method,$arguments){

                #取得當前執行的函式
                $result["function"]=__FUNCTION__;

                #設置執行不正常
                $result["status"]="false";

                #設置執行錯誤
                $result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";

                #設置所丟入的參數
                $result["error"][]=$arguments;

                #回傳結果
                return $result;

                }#function __callStatic end

        /*
        #函式說明:
        #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息陣列
        #$result["function"],當前函數執行的名稱
        #$result["content"],base64UrlEncode编码後的內容。
        #必填參數:
        #$conf["input"],字串,需要編碼的字串.
        $conf["input"]="";
        #可省略參數:
        #無
        #參考資料:
        #https://zhuanlan.zhihu.com/p/94747540
        #備註:
        #無.
        */
        public static function base64UrlEncode(&$conf){

                #初始化要回傳的內容
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #初始化要回傳的語法
                $result["content"]="";

                #如果 $conf 不為陣列
                if(gettype($conf)!="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf==null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("input");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
                #$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                #$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("mimeType","compressType","delFile");
                #$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,「null」代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("null","base64","false");
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                $checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查參數失敗
                if($checkResult["status"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #如果檢查參數不通過
                if($checkResult["passed"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #設置執行正常
                $result["status"]="true";

                #設置 base64UrlEncode 字串
                $result["content"]=str_replace('=', '', strtr(base64_encode($conf["input"]), '+/', '-_'));

                #回傳結果
                return $result;

                }#funcion base64UrlEncode end

        /*
        #函式說明:
        #base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息陣列.
        #$result["function"],當前函數執行的名稱.
        #$result["content"],base64UrlEncode解碼後的內容.
        #必填參數:
        #conf["input"],字串,需要解码的字符串.
        $conf["input"]="";
        #可省略參數:
        #無
        #參考資料:
        #https://zhuanlan.zhihu.com/p/94747540
        #備註:
        #無.
        */
        public static function base64UrlDecode(&$conf){

                #初始化要回傳的內容
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #初始化要回傳的語法
                $result["content"]="";

                #如果 $conf 不為陣列
                if(gettype($conf)!="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf==null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("input");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
                #$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                #$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("mimeType","compressType","delFile");
                #$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,「null」代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("null","base64","false");
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                $checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查參數失敗
                if($checkResult["status"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #如果檢查參數不通過
                if($checkResult["passed"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                $remainder = strlen($conf["input"]) % 4;
                if($remainder){

                        $addlen = 4 - $remainder;
                        $conf["input"] .= str_repeat('=', $addlen);

                        }#if end

                #設置執行正常
                $result["status"]="true";

                #設置 base64UrlDecode 的結果.
                $result["content"]=base64_decode(strtr($conf["input"], '-_', '+/'));

                #回傳結果
                return $result;

                }#function base64UrlDecode end

        /*
        #函式說明:
        #產生 HMACSHA256签名  https://jwt.io/ 中HMACSHA256签名实现
        #回傳結果:
        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
        #$result["error"],錯誤訊息陣列.
        #$result["function"],當前函數執行的名稱.
        #$result["content"],base64UrlEncode(header).".".base64UrlEncode(payload)的簽章
        #必填參數:
        #$conf["input"],string,为base64UrlEncode(header).".".base64UrlEncode(payload)
        $conf["input"]="";
        #$conf["key"],字串,金鑰.
        $conf["key"]="";
        #可省略參數:
        #無.
        #參考資料:
        #https://zhuanlan.zhihu.com/p/94747540
        #https://www.php.net/manual/en/function.hash-hmac.php
        #備註:
        #無.
        */
        public static function signature(&$conf){

                #初始化要回傳的內容
                $result=array();

                #取得當前執行的函數名稱
                $result["function"]=__FUNCTION__;

                #初始化要回傳的語法
                $result["content"]="";

                #如果 $conf 不為陣列
                if(gettype($conf)!="array"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置執行錯誤訊息
                        $result["error"][]="\$conf變數須為陣列形態";

                        #如果傳入的參數為 null
                        if($conf==null){

                                #設置執行錯誤訊息
                                $result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";

                                }#if end

                        #回傳結果
                        return $result;

                        }#if end

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("input","key");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
                #$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
                $conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
                #$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                #$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("mimeType","compressType","delFile");
                #$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                #$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,「null」代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                #$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("null","base64","false");
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                $checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查參數失敗
                if($checkResult["status"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #如果檢查參數不通過
                if($checkResult["passed"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkResult;

                        #回傳結果
                        return $result;

                        }#if end

                #函式說明:
                #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列
                #$result["function"],當前函數執行的名稱
                #$result["content"],base64UrlEncode编码後的內容。
                #必填參數:
                #$conf["input"],字串,需要編碼的字串.
                $conf["jwt::base64UrlEncode"]["input"]=hash_hmac("sha256", $conf["input"], $conf["key"],true);
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlEncode=jwt::base64UrlEncode($conf["jwt::base64UrlEncode"]);
                unset($conf["jwt::base64UrlEncode"]);

                #如果檢查參數失敗
                if($base64UrlEncode["status"]=="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$base64UrlEncode;

                        #回傳結果
                        return $result;

                        }#if end

                #取得加密後的內容
                $result["content"]=$base64UrlEncode["content"];

                #設置執行正常
                $result["status"]="true";

                #回傳結果
                return $result;

                }#function signature end

        /*
        #函式說明:
        #建立 JWT 格式的內容
        #回傳結果:
        #$result["status"],狀態,"true"代表正常;"false"代表不正常.
        #$result["error"],錯誤訊息陣列.
        #$result["content"],jwt token.
        #必填參數:
        #$conf["key"],用來驗證簽章的加解密key.
        $conf["key"]="";
        #可省略參數:
        #$conf["exp"],有效期限要多久,預設為當下加3600秒.
        #$conf["exp"]=time()+3600;
        #$conf["iat"],簽證時間,預設為當下.
        #$conf["iat"]=time();
        #$conf["otherBodies"],陣列,其他要放置的payload body內容,key為名稱,value為內容.
        #$conf["otherBodies"]=array();
        #$conf["base64encodeSig"],是否要base64加密金鑰,預設為"false"不加密,反之"true"代表要加密.
        #$conf["base64encodeSig"]="false";
        #參考資料:
        #無.
        #備註:
        #無.
        */
        public static function makeJWT(&$conf){

                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["argu"],設置給予的參數.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                #$conf["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                $conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("exp","iat","otherBodies","base64encodeSig");
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["skipableVariableName"]=array("exp","iat","otherBodies","base64encodeSig");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["skipableVariableType"]=array("integer","integer","array","string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                $conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(time()+3600,time(),null,"false");
                #$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
                #$conf["disallowAllSkipableVarIsEmpty"]="";
                #$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
                #$conf["disallowAllSkipableVarIsEmptyArray"]="";
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查失敗
                if($checkArguments["status"]==="false")
                {
                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                }#if end

                #如果檢查不通過
                if($checkArguments["passed"]==="false")
                {
                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                }#if end

                #建立 header
                $head=array();
                $head["alg"]="HS256";
                $head["typ"]="JWT";
                $head=json_encode($head);
                #函式說明:
                #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列
                #$result["function"],當前函數執行的名稱
                #$result["content"],base64UrlEncode编码後的內容。
                #必填參數:
                #$conf["input"],字串,需要編碼的字串.
                $conf["jwt::base64UrlEncode"]["input"]=$head;
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlEncode=jwt::base64UrlEncode($conf["jwt::base64UrlEncode"]);
                unset($conf["jwt::base64UrlEncode"]);

                #如果加密失敗
                if($base64UrlEncode["status"]==="false")
                {
                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$base64UrlEncode;

                        #回傳結果
                        return $result;

                }#if end

                #取得加密後的內容
                $head=$base64UrlEncode["content"];

                #初始化 body
                $body=array();

                #設置到期時間
                $body["exp"]=$conf["exp"];

                #設置簽章時間
                $body["iat"]=$conf["iat"];

                #如果有 $conf["otherBodies"]
                if(isset($conf["otherBodies"])){

                        #針對每個 body
                        foreach($conf["otherBodies"] as $key=>$value){

                                #加上 body
                                $body[$key]=$value;

                                }#foreach end

                        }#if end

                $body=json_encode($body);
                #函式說明:
                #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列
                #$result["function"],當前函數執行的名稱
                #$result["content"],base64UrlEncode编码後的內容。
                #必填參數:
                #$conf["input"],字串,需要編碼的字串.
                $conf["jwt::base64UrlEncode"]["input"]=$body;
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlEncode=jwt::base64UrlEncode($conf["jwt::base64UrlEncode"]);
                unset($conf["jwt::base64UrlEncode"]);

                #如果加密失敗
                if($base64UrlEncode["status"]==="false")
                {
                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$base64UrlEncode;

                        #回傳結果
                        return $result;

                }#if end

                #取得加密後的內容
                $body=$base64UrlEncode["content"];

                #產生簽章
                #函式說明:
                #產生 HMACSHA256签名  https://jwt.io/ 中HMACSHA256签名实现
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前函數執行的名稱.
                #$result["content"],base64UrlEncode(header).".".base64UrlEncode(payload)的簽章
                #必填參數:
                #$conf["input"],string,为base64UrlEncode(header).".".base64UrlEncode(payload)
                $conf["jwt::signature"]["input"]=$head.".".$body;
                #$conf["key"],字串,金鑰.
                $conf["jwt::signature"]["key"]=$conf["key"];
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #https://www.php.net/manual/en/function.hash-hmac.php
                #備註:
                #無.
                $signature=jwt::signature($conf["jwt::signature"]);
                unset($conf["jwt::signature"]);

                #如果產生signature失敗
                if($signature["status"]==="false")
                {
                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$signature;

                        #回傳結果
                        return $result;

                }#if end

                #取得簽章
                $sig=$signature["content"];

                #如果有要加密
                if($conf["base64encodeSig"]==="true"){

                        #函式說明:
                        #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
                        #回傳結果:
                        #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                        #$result["error"],錯誤訊息陣列
                        #$result["function"],當前函數執行的名稱
                        #$result["content"],base64UrlEncode编码後的內容。
                        #必填參數:
                        #$conf["input"],字串,需要編碼的字串.
                        $conf["jwt::base64UrlEncode"]["input"]=$sig;
                        #可省略參數:
                        #無
                        #參考資料:
                        #https://zhuanlan.zhihu.com/p/94747540
                        #備註:
                        #無.
                        $base64UrlEncode=jwt::base64UrlEncode($conf["jwt::base64UrlEncode"]);
                        unset($conf["jwt::base64UrlEncode"]);

                        #如果加密失敗
                        if($base64UrlEncode["status"]==="false")
                        {
                                #設置執行失敗
                                $result["status"]="false";

                                #設置錯誤訊息
                                $result["error"]=$base64UrlEncode;

                                #回傳結果
                                return $result;

                        }#if end

                        #取得加密後的sig
                        $sig=$base64UrlEncode["content"];

                        }#if end

                #回傳 JWT token
                $result["content"]=$head.".".$body.".".$sig;

                #設置執行正常
                $result["status"]="true";

                #回傳結果
                return $result;

                }#funcion makeJWT end

        /*
        #函式說明:
        #檢查 JWT token 是否合法
        #回傳結果:
        #$result["status"],"true"代表為正確得JWT token,反之"false"代表不正確得JWT token.
        #$result["content"],陣列
        #$result["content"]["head"],jwt的head物件.
        #$result["content"]["body"],jwt的body物件.
        #$result["error"],錯誤訊息陣列.
        #必填參數:
        #$conf["token"],要驗證的Authorization header內容,亦即"Bearer jwt".
        $conf["token"]="";
        #$conf["key"],用來驗證簽章的加解密key.
        $conf["key"]="";
        #可省略參數:
        #$conf["debug"],"false"代表不debug;"true"代表要debug.
        #$conf["debug"]="true";
        #參考資料:
        #無.
        #備註:
        #無.
        */
        public static function verifyJWT(&$conf){

                #初始化要回傳的結果
                $result=array();

                #參數
                $result["argu"]=$conf;

                #檢查參數
                #函式說明:
                #檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$reuslt["error"],執行不正常結束的錯訊息陣列.
                #$result["function"],當前執行的函式名稱.
                #$result["argu"],設置給予的參數.
                #$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
                #$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
                #$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
                #$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
                #$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
                #$result["argu"],字串陣列,目前輸入的參數名稱陣列.
                #$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
                #$result["notNeedVar"],字串陣列,多餘的參數名稱.
                #必填寫的參數:
                #$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
                $conf["variableCheck::checkArguments"]["varInput"]=&$conf;
                #$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
                $conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
                #可以省略的參數:
                #$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("token","key");
                #$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
                $conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
                #$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
                #$conf["canBeEmptyString"]="false";
                #$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
                #$conf["canNotBeEmpty"]=array();
                #$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
                #$conf["canBeEmpty"]=array();
                #$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
                $conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("debug");
                #$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
                $conf["variableCheck::checkArguments"]["skipableVariableName"]=array("debug");
                #$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
                $conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
                #$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
                $conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
                #$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
                #$conf["disallowAllSkipableVarIsEmpty"]="";
                #$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
                #$conf["disallowAllSkipableVarIsEmptyArray"]="";
                #$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
                #$conf["arrayCountEqualCheck"][]=array();
                #參考資料來源:
                #array_keys=>http://php.net/manual/en/function.array-keys.php
                $checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
                unset($conf["variableCheck::checkArguments"]);

                #如果檢查參數失敗
                if($checkArguments["status"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #如果檢查參數不通過
                if($checkArguments["passed"]==="false"){

                        #設置執行失敗
                        $result["status"]="false";

                        #設置錯誤訊息
                        $result["error"]=$checkArguments;

                        #回傳結果
                        return $result;

                        }#if end

                #取得 token
                $token=$conf["token"];

                #取得 key
                $key=$conf["key"];

                #檢查是否為 JWT token
                $isJWT=strpos($token,"Bearer ");

                #如果是 JWT token
                if($isJWT!==0){

                        #debug
                        if($conf["debug"]==="true"){

                                #設置錯誤訊息
                                $result["error"][]="只允許 JWT token";

                                }#if end

                        #設置檢查不通過
                        $result["status"]="false";

                        #只允許 JWT token
                        return $result;

                        }#if end

                #剔除 "Bearer "
                $token=substr($token,7);

                #涵式說明:
                #將固定格式的字串分開,並回傳分開的結果。
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列
                #$result["function"],當前執行的函數名稱.
                #$result["argu"],使用的參數.
                #$result["oriStr"],要分割的原始字串內容
                #$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
                #$result["dataCounts"],爲總共分成幾段
                #$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
                #必填的參數:
                #$conf["stringIn"],字串,要處理的字串.
                $conf["stringProcess::spiltString"]["stringIn"]=$token;
                #$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.
                $conf["stringProcess::spiltString"]["spiltSymbol"]=".";
                #可省略參數:
                #$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
                $conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
                $spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
                unset($conf["stringProcess::spiltString"]);

                #如果分割字串失敗
                if($spiltString["status"]==="false"){

                        #設置錯誤訊息
                        $result["error"]=$spiltString;

                        #設置檢查不通過
                        $result["status"]="false";

                        #只允許 JWT token
                        return $result;

                        }#if end

                #如果沒有解成3段
                if($spiltString["dataCounts"]!==3){

                        #設置錯誤訊息
                        $result["error"][]="JWT token 應該要透過 . 分成三段";

                        #設置檢查不通過
                        $result["status"]="false";

                        #只允許 JWT token
                        return $result;

                        }#if end

                #取得header
                $head=$spiltString["dataArray"][0];

                #函式說明:
                #base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前函數執行的名稱.
                #$result["content"],base64UrlEncode解碼後的內容.
                #必填參數:
                #conf["input"],字串,需要解码的字符串.
                $conf["jwt::base64UrlDecode"]["input"]=$head;
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlDecode=jwt::base64UrlDecode($conf["jwt::base64UrlDecode"]);
                unset($conf["jwt::base64UrlDecode"]);

                #如果解密失敗失敗
                if($base64UrlDecode["status"]==="false"){

                        #設置錯誤訊息
                        $result["error"]=$base64UrlDecode;

                        #設置檢查不通過
                        $result["status"]="false";

                        #回傳結果
                        return $result;

                        }#if end

                #取得header物件
                $headObj=json_decode($base64UrlDecode["content"]);

                #取得內文
                $body=$spiltString["dataArray"][1];

                #函式說明:
                #base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前函數執行的名稱.
                #$result["content"],base64UrlEncode解碼後的內容.
                #必填參數:
                #conf["input"],字串,需要解码的字符串.
                $conf["jwt::base64UrlDecode"]["input"]=$body;
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlDecode=jwt::base64UrlDecode($conf["jwt::base64UrlDecode"]);
                unset($conf["jwt::base64UrlDecode"]);

                #如果解密失敗失敗
                if($base64UrlDecode["status"]==="false"){

                        #設置錯誤訊息
                        $result["error"]=$base64UrlDecode;

                        #設置檢查不通過
                        $result["status"]="false";

                        #回傳結果
                        return $result;

                        }#if end

                #取得body物件
                $bodyObj=json_decode($base64UrlDecode["content"]);

                #取得簽章
                $sign=$spiltString["dataArray"][2];

                #驗證簽章
                #函式說明:
                #產生 HMACSHA256签名  https://jwt.io/ 中HMACSHA256签名实现
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列.
                #$result["function"],當前函數執行的名稱.
                #$result["content"],base64UrlEncode(header).".".base64UrlEncode(payload)的簽章
                #必填參數:
                #$conf["input"],string,为base64UrlEncode(header).".".base64UrlEncode(payload)
                $conf["jwt::signature"]["input"]=$head.".".$body;
                #$conf["key"],字串,金鑰.
                $conf["jwt::signature"]["key"]=$key;
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #https://www.php.net/manual/en/function.hash-hmac.php
                #備註:
                #無.
                $signature=jwt::signature($conf["jwt::signature"]);
                unset($conf["jwt::signature"]);

                #如果產生signature失敗
                if($signature["status"]==="false"){

                        #設置錯誤訊息
                        $result["error"]=$signature;

                        #設置檢查不通過
                        $result["status"]="false";

                        #回傳結果
                        return $result;

                        }#if end

                #取得簽章
                $expectedSign=$signature["content"];

                #簽章要base64Url加密
                #函式說明:
                #base64UrlEncode  https://jwt.io/ 中base64UrlEncode编码实现.
                #回傳結果:
                #$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
                #$result["error"],錯誤訊息陣列
                #$result["function"],當前函數執行的名稱
                #$result["content"],base64UrlEncode编码後的內容。
                #必填參數:
                #$conf["input"],字串,需要編碼的字串.
                $conf["jwt::base64UrlEncode"]["input"]=$expectedSign;
                #可省略參數:
                #無
                #參考資料:
                #https://zhuanlan.zhihu.com/p/94747540
                #備註:
                #無.
                $base64UrlEncode=jwt::base64UrlEncode($conf["jwt::base64UrlEncode"]);

                #如加密失敗
                if($base64UrlEncode["status"]==="false"){

                        #設置錯誤訊息
                        $result["error"]=$base64UrlEncode;

                        #設置檢查不通過
                        $result["status"]="false";

                        #回傳結果
                        return $result;

                        }#if end

                #取得加密後的簽章
                $expectedSign=$base64UrlEncode["content"];

                #預設未通過驗證
                $passed=false;

                #如果簽證一致
                if($sign===$expectedSign){

                        #設置通過驗證
                        $passed=true;

                        }#if end

                #資料來源可信

                #預設有限期為現今時間加一天
                $exp=time()+86400;

                #如果有有效期限
                if(isset($bodyObj->exp)){

                        #有效期限
                        $exp=$bodyObj->exp;

                        }#if end

                #預設發證時間為現在.
                $iat=time();

                #如果有發證的時間
                if(isset($bodyObj->iat)){

                        #發證的時間
                        $iat=$bodyObj->iat;

                        }#if end

                #如果現在時間大於過期時間
                if(time()>$exp){

                        #debug
                        if($conf["debug"]==="true"){

                                #設置錯誤訊息
                                $result["error"][]="有效期限過期";

                                }#if end

                        #設置檢查不通過
                        $result["status"]="false";

                        #只允許 JWT token
                        return $result;

                        }#if end

                #如果過期
                if($exp<$iat){

                        #debug
                        if($conf["debug"]==="true"){

                                #設置錯誤訊息
                                $result["error"][]="簽章過期";

                                }#if end

                        #設置檢查不通過
                        $result["status"]="false";

                        #只允許 JWT token
                        return $result;

                        }#if end

                #設置通過驗證
                $result["status"]="true";

                #設置要回傳的內容
                $result["content"]=array("head"=>$headObj,"body"=>$bodyObj);

                #回傳結果
                return $result;

                }#function verifyJWT end

        }#class jwt end

?>