2011-01-23 86 views
2

我正在爲我的webservice編寫一個RESTful API。
當我得到一個請求到服務器,我要做的第一件事是檢查appKey和appSecret。
這不是POST方法問題,因爲我可以將它們添加到請求如下:
(此方法返回用戶的詳細信息)爲curl添加GET方法的變量

$data = array('appId'=>$appId, 
       'appSecret'=>$appSecret, 
       'userId'=>$uid); 
$url = "http://mydomain.com/api/user/".$uid; 
$request = curl_init($url); 
curl_setopt($request, CURLOPT_POSTFIELDS, $data); 
$result = curl_exec($request); 

我的問題是我怎麼能(如果可能的話)包括: GET方法中的數據(appSecret,appKey)?

如果不是,我該如何使用GET方法來獲取用戶的詳細信息,然後檢查服務器上的appKey和appSecret?

謝謝!

+1

我不建議在`GET`字符串中放置祕密或密鑰。 URL通常記錄在服務器日誌中。因此,放置認證信息導致信息被惡意存儲。嘗試使用http標頭。 – 2011-01-23 20:17:05

回答

4

在GET請求中,參數在URL的「查詢」部分中傳遞。這樣過

http://www.google.com/search?q=url+query

參數必須進行特殊編碼(「URL編碼」),因爲某些字符具有特殊的含義。

2

爲什麼不把它們放在你的網址,例如:

$ URL =「http://mydomain.com/api/user/".$uid."?arg1=value1 & ARG2 =數值「;

+0

我不想讓appKey和appSecret位於網址中。 – 2011-01-23 19:37:43

+1

然後你不需要GET請求。正如Chris上面所說的,你應該使用HTTP Headers。 – majelbstoat 2011-01-23 23:09:51

1

如果你希望把GET請求的頭,使用的AppKey和appSecret:

$authorization = sprintf('Authorization: AppLogin key="%s", secret="%s"', urlencode($appKey), urlencode($appSecret)); 
curl_setopt($request, CURLOPT_HTTPHEADER, array($authorization)); 

那麼你的REST的服務器上,你就可以得到$ _ SERVER [「HTTP_AUTHORIZATION」應用程序鍵和祕密]通過preg_match。

您也可以使用基本簽名方法,而不是每次傳遞appSecret。

$nonce = sha1(mt_rand()); 
$signature = sha1("$appKey:$appSecret:$nonce"); 
$authorization = 'Authorization: AppLogin key="%s", signature="%s", nonce="%s"', urlencode($appKey), urlencode($signature), urlencode($nonce)); 

然後在服務器上,首先從Authorization頭得到的值,然後拿到分配給基於對AppKey應用程序的祕密,然後重新使用相同的方法簽名,最後比較由應用程序發送的簽名。