我正在構建將託管在服務器上的應用程序。我想爲應用程序構建一個API以促進與任何平臺(Web App,Mobile App)的交互。我不明白的是,當使用REST API時,我們如何驗證用戶。REST API身份驗證
例如,用戶已登錄然後想要創建論壇主題。我如何知道用戶已經登錄?
我正在構建將託管在服務器上的應用程序。我想爲應用程序構建一個API以促進與任何平臺(Web App,Mobile App)的交互。我不明白的是,當使用REST API時,我們如何驗證用戶。REST API身份驗證
例如,用戶已登錄然後想要創建論壇主題。我如何知道用戶已經登錄?
您可以使用HTTP基本或摘要式身份驗證。您可以在其頂部使用SSL安全地對用戶進行身份驗證,但是會降低API的速度。
OAuth是最好的了。奧特所給出的優點是一個可撤銷或可期望的令牌。請參閱下面的如何實現: 工作評論的鏈接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf
請閱讀[這個問題](http://stackoverflow.com/questions/454355/security-of-rest-authentication-計劃)以及Les Hazelwood(Apache Shiro的作者)提供的答案。 –
鏈接已損壞。 – FreeAsInBeer
工作鏈接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf – teksan
我認爲最好的方法是使用OAuth2。谷歌它,你會發現很多有用的職位,以幫助您設置它。
從Web應用程序或移動應用程序開發API的客戶端應用程序將變得更加容易。
希望它可以幫助你。
請閱讀[此問題](http:/ /stackoverflow.com/questions/454355/security-of-rest-authentication-schemes)和Les Hazelwood(Apache Shiro的作者)的答案。 –
例如,當用戶登錄時。現在可以說用戶想創建一個論壇主題,我將如何知道用戶已經登錄?
想一想 - 必須有一些握手來告訴您的「創建論壇」API,該當前請求來自經過身份驗證的用戶。由於REST API通常是無狀態的,因此必須堅持的某個地方。您的客戶端使用REST API負責維護該狀態。通常情況下,用戶登錄後會傳遞一些令牌。如果令牌很好,請求就很好。
檢查Amazon AWS如何進行身份驗證。這是一個完美的例子,從一個API傳遞到另一個API。
*我想爲我以前的回答添加一些實際的迴應。嘗試Apache Shiro(或任何認證/授權庫)。底線,儘量避免自定義編碼。一旦你已經集成了您喜愛的圖書館(我使用Apache四郎,順便說一句),那麼你可以做到以下幾點:
/api/v1/login
和api/v1/logout
JSESSIONID
)被髮送回客戶端(網頁,手機,等等)/api/v1/findUser
這就是全部。希望這可以幫助。
所以你所描述的本質上是一個會話cookie,對吧? – LordOfThePigs
是的,但會話在2個不同的地方「維護」。一個在API服務器中,另一個在瀏覽器中。在成功登錄後,瀏覽器返回的JSON(或其他)應該將API服務器上的會話標識傳遞迴瀏覽器。這些會話由其各自的代理獨立管理。 – Kingz
@Kingz:對我來說聽起來像是會話cookie。對於會話cookie,服務器維護會話ID並將其與給定用戶相關聯。然後,瀏覽器將該ID存儲在每次發送給服務器的Cookie中。我不確定在2個不同的地方「維護」你的意思,除非你的意思是存儲令牌。 – Chris
使用HTTP基本驗證驗證客戶端,但治療的用戶名/密碼,僅作爲令牌臨時會話。
會話令牌只是一個報頭附接到每 HTTP請求,例如:Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0
字符串以上Ym9ic2Vzc2lvbjE6czNjcmV0只是字符串「bobsession1:s3cret」在Base64編碼(這是一個用戶名/密碼) 。
要獲得上述臨時會話令牌,請提供一個API函數(例如:http://mycompany.com/apiv1/login
),它將master-username和master-password作爲輸入,在服務器端創建臨時HTTP Basic Auth用戶名/密碼,返回令牌(例如:Ym9ic2Vzc2lvbjE6czNjcmV0)。這個用戶名/密碼應該是臨時的,它應該在20分鐘左右後過期。
爲了增加安全性確保您的REST服務通過HTTPS提供,這樣的信息都沒有轉移明文
如果你在Java中,Spring Security的庫提供了很好的支持,以實現上述方法
您可能應該在這裏搜索「REST身份驗證」。它已經涵蓋了許多其他問題。 –
簡而言之,讓客戶端使用HTTP基本身份驗證(通過SSL!)發送每個請求的用戶名和密碼,或者進行身份驗證一次,以便客戶端具有經過身份驗證的會話,該會話將在一段時間不活動後過期(或者,您選擇覆蓋你的web框架的'會話處理)。所述會話然後可以被存儲在cookie中,或者可以是每個請求傳遞的參數(例如Java領土中的JSESSIONID)。 – opyate
請參閱[如何控制誰使用我的Web小工具](http://stackoverflow.com/questions/12998701/how-to-control-who-uses-my-web-widget/)。 – Arjan