2013-11-21 45 views
1

我寫一個RESTful API的一個相當複雜的Web應用程序(進一步稱爲api.mywebapp.com)如何在RESTful API中實現兩級認證?

的要求包括api.mywebapp.com應該處理:

  • API級別認證(授權客戶端應用程序如:移動 應用)
  • 用戶級身份驗證(授權www.mywebapp.com 註冊用戶,使他們能夠訪問他們的受保護的資源)

用例:

  1. 移動應用程序連接到https://api.mywebapp.com與 有效基本HTTP授權頭(授權:基本 [base64_encoded_username:密碼])

  2. api.mywebapp.com認證移動應用並在成功認證時使用生成的令牌響應請求。

  3. 移動應用程序現在在所有連續的 請求中使用收到的令牌。 (api.mywebapp.com也限制了經過身份驗證的移動應用程序可以執行的API操作,例如:它不能使用系統管理員級別的API控制器)

  4. 移動應用程序進入狀態,需要登錄www.mywebapp .com用戶訪問並顯示受保護的資源。

這是我不知道這應該如何完成的地方。

api.mywebapp.com是否應該使用基本HTTP身份驗證爲用戶登錄挑戰移動應用?如果是這樣,API級別的當前身份驗證已經到位,那麼這將如何解決?

我之所以使用生成的令牌: www.mywebapp.com是非常會話驅動和令牌還用作一個「會話」標識符(會話也替代以一些服務器端存儲)

所以我面臨兩個不同的問題(這個問題實際上是關於第一個問題的):

  • 如何使用REST API進行多級身份驗證?

  • 如何爲一個非常會話驅動的Web應用程序實現真正的RESTful API,而不會在應用程序本身發生重大變化?我發現這個問題很重要,因爲在RESTful API中,客戶端狀態不能存儲在服務器上。

+0

這純粹是一個概念性問題,還是存在一些技術約束(例如Java,Spring,Tomcat等) –

+0

@JonathanW是的,這是一個概念性問題。 – Laszlo

+0

我不明白什麼額外的值認證客戶端應用程序帶給你的用戶級認證不能。如果你想限制與你的API的物理連接,爲什麼不在傳輸層次上做(例如使用TLS進行相互認證)? –

回答

2

這與OAuth2「資源所有者密碼憑證授予」幾乎相同:http://tools.ietf.org/html/rfc6749#section-4.3。在授權標題中設置客戶端憑證並將用戶憑證發佈爲x-www-form-url-encoded主體。結果可能是一個承載/會話令牌,因爲您已經使用它。

而且,會話是有點問題的,因爲它們需要服務器存儲某種客戶端狀態。您可以使用某種數字簽名返回一個嵌入用戶名+密碼的不記名令牌,以便客​​戶端不能更改它。 OAuth2非常明確,關於不記載持有人令牌的格式。