Rev 226 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*QBPWCF, Quick Build PHP website Component base on Fedora Linux.Copyright (C) 2015~2024 Min-Jhin,ChenThis file is part of QBPWCF.QBPWCF is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong 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變數須為陣列形態";#如果傳入的參數為 nullif($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變數須為陣列形態";#如果傳入的參數為 nullif($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變數須為陣列形態";#如果傳入的參數為 nullif($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"])){#針對每個 bodyforeach($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 tokenif($isJWT!==0){#debugif($conf["debug"]==="true"){#設置錯誤訊息$result["error"][]="只允許 JWT token";}#if end#設置檢查不通過$result["status"]="false";#只允許 JWT tokenreturn $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 tokenreturn $result;}#if end#如果沒有解成3段if($spiltString["dataCounts"]!==3){#設置錯誤訊息$result["error"][]="JWT token 應該要透過 . 分成三段";#設置檢查不通過$result["status"]="false";#只允許 JWT tokenreturn $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){#debugif($conf["debug"]==="true"){#設置錯誤訊息$result["error"][]="有效期限過期";}#if end#設置檢查不通過$result["status"]="false";#只允許 JWT tokenreturn $result;}#if end#如果過期if($exp<$iat){#debugif($conf["debug"]==="true"){#設置錯誤訊息$result["error"][]="簽章過期";}#if end#設置檢查不通過$result["status"]="false";#只允許 JWT tokenreturn $result;}#if end#設置通過驗證$result["status"]="true";#設置要回傳的內容$result["content"]=array("head"=>$headObj,"body"=>$bodyObj);#回傳結果return $result;}#function verifyJWT end}#class jwt end?>