在作一些api接口設計時候會遇到設置權限問題,好比我這個接口只有指定的用戶才能訪問。
不少時候api接口是屬於無狀態的,沒辦法獲取session,就不可以用登陸的機制去驗證,那麼
大概的思路是在請求包帶上咱們本身構造好的簽名,這個簽名必須知足下面幾點:
a、惟一性,簽名是惟一的,可驗證目標用戶
b、可變性,每次攜帶的簽名必須是變化的
c、時效性,具備必定的時效,過時做廢
d、完整性,可以對數據包進行驗證,防止篡改php
直接看下面代碼數據庫
<?php // 設置一個公鑰(key)和私鑰(secret),公鑰用於區分用戶,私鑰加密數據,不能公開 $key = "c4ca4238a0b923820dcc509a6f75849b"; $secret = "28c8edde3d61a0411511d3b1866f0636"; // 待發送的數據包 $data = array( 'username' => 'abc@qq.com', 'sex' => '1', 'age' => '16', 'addr' => 'guangzhou', 'key' => $key, 'timestamp' => time(), ); // 獲取sign function getSign($secret, $data) { // 對數組的值按key排序 ksort($data); // 生成url的形式 $params = http_build_query($data); // 生成sign $sign = md5($params . $secret); return $sign; } // 發送的數據加上sign $data['sign'] = getSign($secret, $data); /** * 後臺驗證sign是否合法 * @param [type] $secret [description] * @param [type] $data [description] * @return [type] [description] */ function verifySign($secret, $data) { // 驗證參數中是否有簽名 if (!isset($data['sign']) || !$data['sign']) { echo '發送的數據簽名不存在'; die(); } if (!isset($data['timestamp']) || !$data['timestamp']) { echo '發送的數據參數不合法'; die(); } // 驗證請求, 10分鐘失效 if (time() - $data['timestamp'] > 600) { echo '驗證失效, 請從新發送請求'; die(); } $sign = $data['sign']; unset($data['sign']); ksort($data); $params = http_build_query($data); // $secret是經過key在api的數據庫中查詢獲得 $sign2 = md5($params . $secret); if ($sign == $sign2) { die('驗證經過'); } else { die('請求不合法'); } } ?>