2011-11-03 290 views
142

我正在構建將託管在服務器上的應用程序。我想爲應用程序構建一個API以促進與任何平臺(Web App,Mobile App)的交互。我不明白的是,當使用REST API時,我們如何驗證用戶。REST API身份驗證

例如,用戶已登錄然後想要創建論壇主題。我如何知道用戶已經登錄?

+3

您可能應該在這裏搜索「REST身份驗證」。它已經涵蓋了許多其他問題。 –

+9

簡而言之,讓客戶端使用HTTP基本身份驗證(通過SSL!)發送每個請求的用戶名和密碼,或者進行身份驗證一次,以便客戶端具有經過身份驗證的會話,該會話將在一段時間不活動後過期(或者,您選擇覆蓋你的web框架的'會話處理)。所述會話然後可以被存儲在cookie中,或者可以是每個請求傳遞的參數(例如Java領土中的JSESSIONID)。 – opyate

+0

請參閱[如何控制誰使用我的Web小工具](http://stackoverflow.com/questions/12998701/how-to-control-who-uses-my-web-widget/)。 – Arjan

回答

56

您可以使用HTTP基本或摘要式身份驗證。您可以在其頂部使用SSL安全地對用戶進行身份驗證,但是會降低API的速度。

  • 基本身份驗證 - 對使用用戶名和密碼
  • 摘要式身份驗證Base64編碼 - 通過網絡發送之前散列的用戶名和密碼。

OAuth是最好的了。奧特所給出的優點是一個可撤銷或可期望的令牌。請參閱下面的如何實現: 工作評論的鏈接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

+4

請閱讀[這個問題](http://stackoverflow.com/questions/454355/security-of-rest-authentication-計劃)以及Les Hazelwood(Apache Shiro的作者)提供的答案。 –

+3

鏈接已損壞。 – FreeAsInBeer

+2

工作鏈接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf – teksan

6

我認爲最好的方法是使用OAuth2。谷歌它,你會發現很多有用的職位,以幫助您設置它。

從Web應用程序或移動應用程序開發API的客戶端應用程序將變得更加容易。

希望它可以幫助你。

+2

請閱讀[此問題](http:/ /stackoverflow.com/questions/454355/security-of-rest-authentication-schemes)和Les Hazelwood(Apache Shiro的作者)的答案。 –

101

例如,當用戶登錄時。現在可以說用戶想創建一個論壇主題,我將如何知道用戶已經登錄?

想一想 - 必須有一些握手來告訴您的「創建論壇」API,該當前請求來自經過身份驗證的用戶。由於REST API通常是無狀態的,因此必須堅持的某個地方。您的客戶端使用REST API負責維護該狀態。通常情況下,用戶登錄後會傳遞一些令牌。如果令牌很好,請求就很好。

檢查Amazon AWS如何進行身份驗證。這是一個完美的例子,從一個API傳遞到另一個API。

*我想爲我以前的回答添加一些實際的迴應。嘗試Apache Shiro(或任何認證/授權庫)。底線,儘量避免自定義編碼。一旦你已經集成了您喜愛的圖書館(我使用Apache四郎,順便說一句),那麼你可以做到以下幾點:

  1. 創建一個登錄/註銷API,如:/api/v1/loginapi/v1/logout
  2. 在這些登錄和註銷的API,執行你 用戶存儲
  3. 結果的認證令牌(通常,JSESSIONID)被髮送回客戶端(網頁,手機,等等)
  4. 從這時開始,所有後續調用由您的客戶端 做將包括這個標記
  5. 比方說,你的下一個電話就是所謂/api/v1/findUser
  6. 的第一件事,這個API代碼將做的是檢查令牌的API的(「是 該用戶認證?」)
  7. 如果答案回來如否,那麼您將HTTP 401狀態 丟回客戶端。讓他們處理它。
  8. 如果答案是YES,然後繼續返回請求的用戶

這就是全部。希望這可以幫助。

+0

所以你所描述的本質上是一個會話cookie,對吧? – LordOfThePigs

+0

是的,但會話在2個不同的地方「維護」。一個在API服務器中,另一個在瀏覽器中。在成功登錄後,瀏覽器返回的JSON(或其他)應該將API服務器上的會話標識傳遞迴瀏覽器。這些會話由其各自的代理獨立管理。 – Kingz

+0

@Kingz:對我來說聽起來像是會話cookie。對於會話cookie,服務器維護會話ID並將其與給定用戶相關聯。然後,瀏覽器將該ID存儲在每次發送給服務器的Cookie中。我不確定在2個不同的地方「維護」你的意思,除非你的意思是存儲令牌。 – Chris

31
  1. 使用HTTP基本驗證驗證客戶端,但治療的用戶名/密碼,僅作爲令牌臨時會話。

    會話令牌只是一個報頭附接到 HTTP請求,例如:Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    字符串以上Ym9ic2Vzc2lvbjE6czNjcmV0只是字符串「bobsession1:s3cret」在Base64編碼(這是一個用戶名/密碼) 。

  2. 要獲得上述臨時會話令牌,請提供一個API函數(例如:http://mycompany.com/apiv1/login),它將master-username和master-password作爲輸入,在服務器端創建臨時HTTP Basic Auth用戶名/密碼,返回令牌(例如:Ym9ic2Vzc2lvbjE6czNjcmV0)。這個用戶名/密碼應該是臨時的,它應該在20分鐘左右後過期。

  3. 爲了增加安全性確保您的REST服務通過HTTPS提供,這樣的信息都沒有轉移明文

如果你在Java中,Spring Security的庫提供了很好的支持,以實現上述方法

+1

爲什麼要在20分鐘後過期?如果這是一個類似Facebook的網站,那麼登錄是直到用戶註銷? – Dejell

+1

@dejel我在假設「會議」是暫時性的。如果用戶空閒,它通常會過期 – gerrytan