2014-10-22 213 views
2

我試圖讓我的頭腦如何將基於令牌的(基於密鑰的)身份驗證引入Web API(目前正在查看Sinatra,但也許是Rails),這將是由移動客戶端使用以及OAuth如何適合圖片。API身份驗證和OAuth2的使用

因此,假設我想創建一個使用Facebook進行身份驗證並獲取基本用戶數據的Web服務。在這裏,我的API將成爲Facebook OAuth服務器的客戶端,在用戶成功登錄Facebook時請求訪問令牌。然後,這將授予我訪問用戶的數據的權限,我將使用該數據在我的數據庫中創建一個條目,將此用戶特定的令牌與我希望鏈接到的任何其他應用程序信息一起存儲。

我想我到目前爲止有這部分權利,但這裏是我有點困惑。

我認爲我的API還需要某種形式的API密鑰才能授予移動用戶訪問權限,因爲我不想在他們的設備上傳輸和存儲Facebook密鑰。我是否需要單獨存儲我提供給客戶訪問我的服務的密鑰?有沒有「最佳實踐」的方式來做到這一點?

回答

2

我需要單獨存儲一些密鑰嗎?我提供給客戶來訪問我的服務?

是的。

有沒有這樣做的最佳做法?

最簡單的方法是在每個用戶創建時生成一個單獨的身份驗證令牌並將其顯示給移動客戶端。然後將其隨每個後續請求標頭一起發送。

設計提供了一個simple example如何實現這一點。你不需要爲此設計,只需提供一些令牌生成機制。

#Devise.friendly_token 
def self.friendly_token 
    SecureRandom.urlsafe_base64(15).tr('lIO0', 'sxyz') 
end 

這種機制可以擴展到在以下幾個方面

  1. 作爲一個的oauth2提供商本身提供更多的安全性。 在facebook上成功登錄後,您將生成一個:authorization_code,客戶端可以在下一步中爲您自己的Oauth2承載或MAC令牌交換身份。然後,您可以發送您自己的Oauth2令牌以及每個用戶身份驗證請求。 請參閱rack-oauth2

  2. 實施HMAC令牌加密。 生成一個secret_key並將其顯示給每個客戶端。使用該祕密對唯一的客戶端ID進行簽名。服務器然後可以查找特定client_id的secret_key並驗證消息。
    請參閱api-auth

相關問題