2011-12-15 120 views
28

我建立了一個項目,一個RESTful API我的工作,我想提出的主要應用消費自己的API消耗API,因爲:問題關於通過OAuth

  1. 這將導致在有一組代碼保持
  2. 如果我們決定要揭露爲第三方軟件開發人員將已經完成的API
  3. 它開闢了可能性,使消耗它的移動應用
  4. 我真的想學習怎麼辦

該API將託管在子域https://api.example.com上,主Web應用程序將託管在根域https://example.com

從理論上講,我明白一切是如何運作的,但我的主要問題是驗證流程如何改變。通常情況下第三方應用程序會:

  1. 獲得https://api.example.com/request_token
  2. 請求令牌將用戶重定向到上https://api.authenticate.com/authorize
  3. 認證獲取重定向到第三方應用
  4. https://api.example.com/access_token
  5. 獲得訪問令牌

因爲我控制兩個域,我可以做類似於:

  1. 獲取請求令牌時上https://www.example.com調用相同的代碼https://api.example.com/authorize
  2. 在登錄屏幕上的用戶的土地在https://www.example.com
  3. 用戶認證使用表單如果憑證有效,則請求令牌交換在訪問令牌
  4. 訪問令牌保存在會話,並在用戶喜歡它註銷到期通常會

步驟3感覺就像它是錯的,因爲會有duplica te代碼,但不是它打開我的XSS攻擊是登錄表上https://www.example.com發送數據到https://api.example.com因爲他們是在技術上不同的域?

我是不是過度複雜?

回答

20

我遇到了同樣的問題,並解決它這樣。

對於第三方應用程序,使用我的API,他們必須通過OAuth對所有請求進行身份驗證。

對於我自己的第三方客戶端(移動,AIR等) - 他們使用OAuth,與我讓這些直接在授權步驟發送的用戶名和密碼的差異(所以我可以做一個本地登錄對話框)。假設您的API是通過SSL/HTTPS提供的。

對於我的web應用程序,我使用cookie身份驗證來訪問API。即登錄後,用戶可以簡單地調用API:url並返回JSON/XML。對於快速瀏覽API也很好(雖然像APIGee這樣的真正的API控制檯在那裏做得更好)。

+2

請您詳細說明第3項?用戶登錄時是否將會話ID保存在cookie中,然後將其用作僞訪問令牌,以便在您進行API調用時,然後在收到API請求時查找它?這似乎是一個安全漏洞... – Steve 2011-12-16 19:35:14

0

我會說你有點過於複雜。如果您的代碼是正確分離的,那麼您可以輕鬆地在您的應用程序的服務層上構建一個瘦REST層,同時讓您的應用程序的控制器成爲服務層上的薄層。

+2

你是什麼意思的服務層?控制器內部的模型是否完成所有繁重的工作?如果是這樣,那麼這就是我的計劃 - 這真的是認證位讓我循環。我想將所有的業務邏輯都轉移到一個單獨的API子域中,因爲我們需要將它暴露給移動應用程序開發,並且我認爲它會幫助我獲得可伸縮性,因爲我可以旋轉或縮小數字的啞客戶端連接到API,只需要中央API處理所有的數據緩存。雖然我對可擴展性瞭解不多,但... – Steve 2011-12-16 13:22:49