2011-05-20 105 views
4

讓我們假設有一個服務在那裏;

http://exmaple.com/service1/GetSomething?apikey= {API密鑰-GOES-這裏}

的我的API密鑰:96a143c8-2f62-470c-b81f-dec5fc271873

,所以我們會打電話給>http://exmaple.com/service1/GetSomething?apikey=96a143c8-2f62-470c-b81f-dec5fc271873鏈接,並以JSON的形式返回響應。

當我使用JQuery(或任何其他客戶端JavaScript庫)消費時,該密鑰將如何安全?我在想,我覺得沒有辦法。如果我打算用客戶端電話打電話給該服務,這將是我們公開的。

對此有何看法?

謝謝。

回答

9

做一個代理。

將值發佈到您的某個頁面,然後從此頁面在服務器端發出真正的請求,然後返回您獲得的值。

值得注意的是:你不能用javascript做出跨域請求,主要是瀏覽器不允許出於安全原因。

+0

完全正確! +1! (注意注意:你可以使用JSONP模擬跨域請求) – jwueller 2011-05-20 10:28:34

+0

@BrunoLM好的,我部分理解了這一點。 ***'您無法使用javascript'***進行跨域請求,因此根據此句,http://exmaple.com/service1/GetSomething?apikey=96a143c8-2f62-470c-b81f-dec5fc271873服務不能從http://example.org用客戶端代碼調用。對? – tugberk 2011-05-20 12:38:30

+0

@BrunoLM還讓我們假設我創建了一個服務來在我的應用程序中使用該服務。而這個服務的URL是http://example.co.uk/MyService這個服務將包含我的API密鑰和所有的東西,它會返回結果。因此,該服務將成爲我在客戶端代碼中使用的服務。什麼會阻止smbdy消費該服務?例如,與小提琴手? – tugberk 2011-05-20 12:44:21

2

只有這樣,才能從客戶端的角度是代理請求將其固定到API您的服務器上,添加在你的應用程序,密鑰。

+0

謝謝。同樣的問題:讓我們假設我創建了一個服務來在我的應用中使用該服務。這個服務的URL是example.co.uk/MyService這個服務將包含我的API密鑰和所有這些東西,它會返回結果。因此,該服務將成爲我在客戶端代碼中使用的服務。什麼會阻止smbdy消費該服務?例如,與小提琴手?據我所知,任何有能力查看我的html標記源的人都可以使用該服務。我在這裏的正確方向? – tugberk 2011-05-20 12:46:05

+2

這是另一個問題。事實上,API密鑰將被有效屏蔽,因爲代理將自己處理對外部Web服務的請求。但有人閱讀你的HTML並用適當的參數調用你的代理應該能夠消費來自外部服務的結果。現在,這只是「基本」安全問題。如何防止用戶調用網頁並授權另一個用戶...例如,會話管理可以通過特定用戶的會話中的令牌來實現。或根據您的要求,您可以通過IP – Grooveek 2011-05-20 12:53:44

+0

hmm限制訪問進行多項檢查,從而創建合理的令牌聲音。所以,當一個網頁被調用時,我可以創建一個令牌,它將在頁面和我的服務之間共享。所以,我可以將令牌傳遞給我的服務並進行比較。或者,基本上我可以從我的服務訪問會話集合來讀取我的令牌的特定會話?我可以嗎? – tugberk 2011-05-20 13:07:26

0

我發現的最佳方法是給你的用戶一個API_KEY和一個SECRET_KEY。

構建您的REST API請求,傳遞API_KEY,時間戳和進行調用所需的任何其他參數。

使用像PHP這樣的腳本語言創建一個API_SIGNATURE變量,使用您的SECRET_KEY使用雙向加密並將其附加到您的基礎URL,這就是您作爲請求觸發的內容。

現在任何人都可以看到該請求,這就是爲什麼你把時間戳作爲參數。基本上你可以放入一個限制,只處理少於一分鐘的請求。

例子:(做這部分的腳本語言)

$API_BASE_URL="http://api.yourdomain.com/1.1/comments.json?api_key=2002&timestamp=2323234544&id=4"; 
$API_KEY=300; 
$API_SIGNATURE=hash_hmac('sha256', API_BASE_URL, API_KEY); 
$API_URL=$API_BASE_URL.'&api_signature='.$API_SIGNATURE; 

-

現在,在您的jQuery AJAX網址:使用PHP回聲出$ API_URL。

-

在你的API時,你可以查找用戶的請求帳戶基於API_KEY並得到他們的SECRET_KEY和解密簽名,並確保符合什麼傳入如果通行證現在檢查。時間戳,並確保請求不到一分鐘。

在處理請求之前,您還可以進行速率限制和其他一些其他內容。

就是這樣。


還有人說瀏覽器不允許跨域請求。如果你要求json,但是你可以使用jsonp解決這個問題。


hash_hmac有許多編程和腳本語言。所以如果你開發一個API,你可以在PHP上使用它,並在你的iPhone應用程序中使用目標C.

很簡單。