[英]how can I authenticate a user from a web app to an API?
這似乎是一個廣泛問的問題,在閱讀了大量關於這個主題的文檔后,我仍然不確定是否正確理解了所有內容(我認為愚蠢是一個可能的答案;))。
我正在嘗試構建一個為用戶提供服務的API。 用戶將通過Facebook或任何OpenId提供商連接(我將Facebook分開,因為他們實現了自己的連接系統)。
(我認為這是一個很好的方法,因為我不會存儲用戶的密碼,並且在類似的Gawker問題的情況下最終會有更少的問題。)
當客戶端(Web應用程序,移動應用程序等)向API發出請求時,必須與請求一起發送指示符 ,以便確定哪個用戶正在使用該應用程序。 這通常通過在身份驗證期間定義的令牌使用。
而對於認證,我無法找到任何有價值的例子,教程,了解如何正確地實現它的解釋。
我(試着)解釋一下:
在我(幸福護理熊的精彩世界)中,我將項目分為不同部分:
據我所知,每當有人詢問如何實現RESTful API身份驗證時,會彈出三個主要答案:
因為我不會存儲用戶的密碼,所以第一個用於我,但另外兩個讓我感到困惑。
但OAuth和OpenId 並不相同 ,一個(OpenId)代表身份驗證 (問題的基礎),其中第二個(OAuth)代表授權 !
當Twitter為其API實現OAuth時,他們沒有實現身份驗證系統,有一種方法可以指示用戶應用程序X希望訪問用戶帳戶(在各種訪問級別)。 如果用戶當前未登錄Twitter,則他首先必須對自己進行身份驗證, 然后授權當前應用程序訪問其數據。
所以,為了清理起來, OAuth不是一種身份驗證機制 ,它是:
允許安全API授權的開放協議(來源: http : //oauth.net/ )
然后,驗證用戶的唯一方法是使用OpenId。 然后,地獄成真了。
如果我以一個專門由html / css / js組成的Web應用程序為例,沒有服務器端組件,則與API通信。
Web應用程序必須向API指示當前使用API的用戶是X先生。
為此,Web應用程序會顯示一個包含OpenId提供程序列表的彈出窗口,要求用戶對自己進行身份驗證。 用戶單擊其中一個,重定向(或打開一個新的彈出窗口)到OpenId提供程序,指示他的登錄/通過,由OpenId提供程序進行身份驗證,使用令牌返回成功(我簡化了通信)。
這很棒,網絡應用現在知道用戶真的是X先生。但是API仍然有任何線索!
最后,我的問題非常簡單:我如何通過Web應用程序通過OpenId對x先生進行身份驗證,然后,如何通過Web應用程序和api保存當前正在使用Web應用程序的先生X的信息當然還有API。
非常感謝您的幫助 !
- 編輯格式
(如果你不想閱讀,下面的列表總結了整個想法)
一個可能的解決方案(告訴我,如果我錯了)將在消費者(網絡應用程序,移動應用程序等)中顯示登錄表單,用戶點擊它的提供者(myopenid,谷歌等)打開一個彈出窗口登錄。 棘手的部分是return_to參數將設置為API,而不是網站
然后,API將重新發送check_authentication並獲取is_valid:true(或不是)。 在此步驟中,應用程序將查詢api以返回返回身份驗證狀態(處理,失敗,成功)的特定URL。 在處理過程中,會向用戶顯示一個指示符(加載gif),如果成功/失敗,則會向用戶顯示結果。
如果api收到一個is_valid:true,那么它會向openid服務器詢問有關用戶的信息,比如email,firstname,lastname,並將它們與用戶的數據庫進行比較。 如果匹配,則api在其自身與應用之間創建會話,如果用戶是新用戶,則創建新條目然后創建會話。
會話將是具有特定持續時間的唯一令牌(可能等於openid server assoc_handle持續時間?)
這似乎是可能的,但我不是安全方面的專家。
為了解釋簡單的事情,這里有一點“地圖”:
注意:Provider是OpenId服務器(提供有關身份驗證的信息)
您真的不想使用OpenID登錄API。 如你所說,OpenID用於身份驗證 ,即Who,而OAuth用於授權 ,即我是否允許? 但是您的結構建議您將API用作后端,將Web應用程序用作前端。
最好的方法是在Web應用程序上使用OpenID對用戶進行身份驗證,然后Web應用程序連接到API並存儲OpenID憑據。 然后,web-app知道用戶是誰,並且可以提供服務。 API與用戶無關,只是它存儲了數據。
OpenID和OAuth之間的根本區別在於它的使用。 在你的情況下,你可以有類似的東西:
-------- --------- -------
| User | <------> | App | <--------> | API |
-------- OpenID --------- (OAuth) -------
用戶永遠不會直接與API交互:誰想要手動發送HTTP請求? (lol)相反,該服務是通過應用程序提供的,可以選擇使用OAuth授權。 但是,如果單個應用程序訪問API,您可以將應用程序<=> API連接內部並且永遠不會公開它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.