2012-10-31 145 views
2

我正在構建基於API的PHP體系結構。PHP REST API客戶端驗證

我想確保試圖使用不同的API密鑰來使用我的API的客戶端是授權客戶端。例如,將API Key「ABCD1234」分配給域「example.com」。如果域名「fraud.com」嘗試使用此API密鑰,則它們不應該能夠使用該API。我如何在API端執行此檢查?

根據我迄今爲止看到的情況,客戶通過引用標頭非常容易「僞造」它的真實身份。

另外我還記得谷歌地圖首次推出API時,他們實現了一種類似的技術,只有授權的URL可以使用相應的API密鑰。所以這似乎沒有出現可能性的問題。

任何幫助/方向,將不勝感激。

謝謝

-Saf

+0

這取決於如何使用API​​。它是基於瀏覽器/ Javascript的用例嗎?服務器 - 服務器用例?客戶端應用用例? – deceze

+0

@deceze API最初將在服務器 - 服務器用例中使用。但是,我需要構建它以支持所有其他用例。或者至少可以在業務需求發生變化時添加其他用例的方式構建它。 –

+2

首先,strightforward方法可能可能是從傳入的請求獲取IP地址,併爲它們製作反向DNS,然後將域與白名單進行比較。如果您想消除反向DNS階段,您可以通過IP註冊您的客戶,而不是域。 – Stan

回答

1

在一個服務器到服務器的情況下,有很少可以用做域名,因爲沒有必然牽涉任何領域。這只是一個來自某個IP的傳入(HTTP)請求。該IP不一定必須與DNS系統中的任何主機條目綁定。您可以做的最好的做法是要求您的客戶註冊允許的IP地址。由於各種原因,反向DNS解決方案是不可行的,尤其是因爲它們要求客戶端正確設置反向DNS,這可能並不實際。

如果用例是瀏覽器端,您可以使用Google Maps方法,在該方法中,您需要客戶端包含服務器中的腳本,該腳本將檢查瀏覽器中當前頁面的位置。儘管如此,即使這不是完全的脾氣證明,因爲任何客戶端。檢查HTTP Referer服務器端也是一個選項,但也很容易被任何真正想要的人顛覆。結合起來可以使它變得足夠困難,所以大部分的濫用者都會被嚇倒。

+0

我會說使用if(document.domain =='expected-domain.com)'的瀏覽器端驗證是脾氣證明,*如果*可以確定它實際上是一個提取JavaScript的瀏覽器,並且如果JavaScript不能使用XHR/Ajax獲取(因此不支持CORS和JSONP,對於JavaScript)。但是,確保它是瀏覽器可能需要訪問者從API的服務器獲取一些cookie,例如通過強制身份驗證,當然這對於公共服務來說是不可行的。請注意,REFERER對於合法請求也可能是空白的(http://en.wikipedia.org/wiki/HTTP_referer#Referer_hiding)。 – Arjan