2009-12-02 55 views
30

我使用RESTful API構建基於Pylons的Web應用程序,該應用程序當前缺少任何驗證。所以我要實現這一點,爲了避免所有存儲用戶密碼的麻煩和謹慎,我想使用OpenID進行身份驗證。什麼是最好的方法來做到這一點?這兩件事是否兼容?是否存在使用OpenID的現有REST API,我可以從中獲得靈感?如何在RESTful API中使用OpenID?

回答

30

我現在已經花了一些時間研究這些選項並希望總結研究結果。首先,多一點上下文 - 我開發和控制服務和API消費者。消費者是基於Flash的應用程序,它從API現在使用的相同主機提供,並且應該在瀏覽器中使用。目前還沒有第三方客戶。

所以,問題可以分爲兩個部分進行劃分,

  • 我怎麼通過API做OpenID身份驗證
  • 我怎麼維持後續的請求「認證」狀態

對於第一部分,OpenID身份驗證幾乎總是包含交互式步驟。在認證過程中,很可能會有一個步驟,用戶在OpenID提供商的網頁中,登錄並按下一些「我同意」按鈕。所以API不能也不應該透明地處理這個問題(沒有「告訴我你的OpenID提供者和密碼,我會做其餘的」)。它能做的最好的是傳遞和返回客戶端必須打開並遵循指示的HTTP鏈接。

保持「認證」狀態

的REST API應該是無狀態的,每個請求應包括處理它,正確的所需的所有信息?對於每個請求對OpenID提供者進行身份驗證都沒有任何意義,因此一些類型的會話是必需的。一些用於通信會話密鑰(或「訪問令牌」或用戶名/密碼)選項有:

  • HTTPS +基本身份驗證(「授權:基本...」在每個請求頭)
  • 簽名請求Amazon-style(「授權:AWS ...」中的每個請求頭)
  • 的OAuth:獲取訪問令牌,包括並在其存儲會話密鑰(「曲奇每個請求
  • 曲奇一羣其他參數:... 「每個請求中的標題)
  • 存儲會話信息的簽名cookie在餅乾本身

現在只有一個API消費者,所以我選擇了最簡單的事情,可能工作 - 餅乾。在Beaker的幫助下,它們非常易於在Pylons中使用。他們也在Flash應用程序中「正常工作」 - 因爲它在瀏覽器中運行,所以瀏覽器將在Flash應用程序發出的請求中包含相關的Cookie - 根本不需要更改應用程序。這裏有一個StackOverflow問題,也提倡使用cookies:RESTful authentication for web applications

燒杯也有很好的功能cookie-only sessions所有的會話數據都包含在cookie本身。我想這是關於無狀態的。服務器上有沒有會話存儲。 Cookies被簽名並且可選地被加密以避免在客戶端篡改它們。缺點是cookie變得更大一些,因爲它現在需要存儲更多的會話密鑰。通過刪除一些我在會話中不需要的東西(來自OpenID身份驗證的剩菜),我將cookie的大小降低到了大約200字節。

4

OAuth更適合API使用。以下是Python中使用的OAuth示例:oauth-python-twitter。 Leah Culver的python-oauth庫是Python中OAuth的規範實現,但python-oauth2是最近引起一些嗡嗡聲的競爭者。至於靈感,django-piston支持在爲Django創建RESTful API時使用OAuth進行身份驗證,儘管文檔不如我想要的那個特定主題。

+0

API目前主要針對客戶端 - 服務器場景。客戶端是Flash應用程序,服務器是Pylons web應用程序。目前沒有服務器到服務器的東西,所以不需要三條腿的東西。我目前的問題是如何在系統中引入「認證用戶」,而不必處理存儲密碼,發送密碼提醒,重置密碼等。目前還不清楚OAuth如何幫助我,因爲在2腳版本中它只是指定了如何簽署請求。 – 2009-12-02 15:23:24

+1

在這種情況下,可能是http://pylonshq.com/pasties/by_tag/openid中的一個粘貼會有所幫助。 – 2009-12-02 16:06:56

3

如果您構建API,則可以檢查OAuth協議。它是OpenID的補充。