久久调教,免费看黄色影片,www五月,国产精品免费一区二区区,亚洲欧美日韩综合一区,亚洲欧美日韩精品在线,2021免费日韩视频网

龍巖易富通網(wǎng)絡(luò)科技有限公司

龍巖小程序開(kāi)發(fā),龍巖分銷(xiāo)系統(tǒng)

API權(quán)限設(shè)計(jì)總結(jié)

2015.09.10 | 840閱讀 | 0條評(píng)論 | 未命名

API權(quán)限設(shè)計(jì)總結(jié): 最近在做API的權(quán)限設(shè)計(jì)這一塊,做一次權(quán)限設(shè)計(jì)的總結(jié)。 1. 假設(shè)我們需要訪問(wèn)的API接口是這樣的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx&sign=sadasdas&timestamp=2013-03-05 10:14:00&c=c&a=a&d=d 2. 接口調(diào)用的控制器:openapi/v1/get/user/ 3. 步驟一:作為服務(wù)端,首先要檢查參數(shù)是否正確:key (用戶(hù)的key) ;sign(加密的簽名串) ;timestamp (請(qǐng)求的時(shí)間,服務(wù)端對(duì)請(qǐng)求有時(shí)間生效),這些參數(shù)如果有一個(gè)參數(shù)沒(méi)傳遞,肯定返回參數(shù)不正確的結(jié)果。 4. 步驟二:參數(shù)如果都傳遞正確,這個(gè)時(shí)候需要檢查API的白名單權(quán)限,API也就是(openapi/v1/get/user/)是否存在在我們的數(shù)據(jù)庫(kù)中,一般會(huì)有一張API的數(shù)據(jù)表,如果調(diào)用的API不在我們的數(shù)據(jù)庫(kù)白名單中或者這個(gè)API已經(jīng)關(guān)閉訪問(wèn)了,那么要返回禁止訪問(wèn)的結(jié)果。 5. 步驟三: 如果API在白名單中,那么現(xiàn)在就要檢查用戶(hù)的KEY是否正確了,服務(wù)端會(huì)有一張用戶(hù)權(quán)限表,這個(gè)數(shù)據(jù)表主要用來(lái)記錄用戶(hù)的key secret(密鑰) 以及API權(quán)限列表,檢查這個(gè)用戶(hù)對(duì)訪問(wèn)的API(openapi/v1/get/user/)是否有權(quán)限,如果有權(quán)限則通過(guò),沒(méi)權(quán)限則關(guān)閉。 6. 步驟四: 如果用戶(hù)權(quán)限通過(guò),這個(gè)時(shí)候就到了最重要的一步,SIGN簽名的驗(yàn)證。 簽名算法: 加密方式 md5(POST參數(shù)(升序排序,除key sign參數(shù)除外) + 用戶(hù)密鑰) PHP加密算法代碼: [php] /** * 簽名生成算法 * @param array $params API調(diào)用的請(qǐng)求參數(shù)集合的關(guān)聯(lián)數(shù)組,不包含sign參數(shù) * @param string $secret 簽名的密鑰即獲取access token時(shí)返回的session secret * @return string 返回參數(shù)簽名值 */ function getSignature($params, $secret) { $str = ''; //待簽名字符串 //先將參數(shù)以其參數(shù)名的字典序升序進(jìn)行排序 ksort($params); //遍歷排序后的參數(shù)數(shù)組中的每一個(gè)key/value對(duì) foreach ($params as $k => $v) { //為key/value對(duì)生成一個(gè)key=value格式的字符串,并拼接到待簽名字符串后面 $str .= "$k=$v"; } //將簽名密鑰拼接到簽名字符串最后面 $str .= $secret; //通過(guò)md5算法為簽名字符串生成一個(gè)md5簽名,該簽名就是我們要追加的sign參數(shù)值 return md5($str); }[/php] 調(diào)用示例: [php] $uid = 67411167; $params = <a href="http://www.php.net/array">array</a>( "session_key" => "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=", "timestamp" => "2011-06-21 17:18:09", "format" => "json", "uid" => $uid, ); $sign = getSignature($params, "27e1be4fdcaa83d7f61c489994ff6ed6");[/php] 注意:加密的時(shí)候,需要將timestamp帶上,防止客戶(hù)端篡改。 客戶(hù)端,將自己需要傳遞的參數(shù)進(jìn)行升序排序,然后加上自己key對(duì)應(yīng)的密鑰(密鑰在服務(wù)端數(shù)據(jù)庫(kù)中有一份保存,這個(gè)是不能對(duì)外公開(kāi)的)進(jìn)行MD5加密,通過(guò)參數(shù)sign傳遞到服務(wù)端。 服務(wù)端拿到sign值后,對(duì)傳遞過(guò)來(lái)的參數(shù)也進(jìn)行同樣的算法排序,并經(jīng)過(guò)用戶(hù)的key查詢(xún)得到密鑰,然后進(jìn)行一次加密算法,得到的服務(wù)端的sign和客戶(hù)端傳遞過(guò)來(lái)的sign進(jìn)行比較,如果相同則表示是可以通過(guò)的,如果中途有人篡改數(shù)據(jù)等,那么最終加密出來(lái)的sign就是不一致的,這樣保證了用戶(hù)傳遞數(shù)據(jù)的可靠性和安全性。   7. 步驟五:檢查時(shí)間戳?xí)r間,比較客戶(hù)端時(shí)間和服務(wù)端時(shí)間是否在10分鐘之內(nèi),如果10分鐘之外了,那么返回超時(shí)的提示,這樣能保證調(diào)用過(guò)的接口數(shù)據(jù)能在一定時(shí)間內(nèi)銷(xiāo)毀掉。   8. 步驟六:調(diào)用相應(yīng)邏輯

贊 (

發(fā)表評(píng)論