簡體   English   中英

如何從Web應用程序向API驗證用戶身份?

[英]how can I authenticate a user from a web app to an API?

這似乎是一個廣泛問的問題,在閱讀了大量關於這個主題的文檔后,我仍然不確定是否正確理解了所有內容(我認為愚蠢是一個可能的答案;))。

我正在嘗試構建一個為用戶提供服務的API。 用戶將通過Facebook或任何OpenId提供商連接(我將Facebook分開,因為他們實現了自己的連接系統)。

(我認為這是一個很好的方法,因為我不會存儲用戶的密碼,並且在類似的Gawker問題的情況下最終會有更少的問題。)

當客戶端(Web應用程序,移動應用程序等)向API發出請求時,必須與請求一起發送指示符 ,以便確定哪個用戶正在使用該應用程序。 這通常通過在身份驗證期間定義的令牌使用。

而對於認證,我無法找到任何有價值的例子,教程,了解如何正確地實現它的解釋。

我(試着)解釋一下:

在我(幸福護理熊的精彩世界)中,我將項目分為不同部分:

  • RESTful API
  • 一個將使用api的網絡應用程序。 理想情況下,我正在考慮制作一個完整的html / css / js項目,沒有任何服務器端工作(php / python / java或其他)
  • 移動應用程序
  • 一個windows / mac / linux應用程序

據我所知,每當有人詢問如何實現RESTful API身份驗證時,會彈出三個主要答案:

  • HTTP基本(最好是SSL)/摘要方式
  • OAuth的
  • 的OpenID

因為我不會存儲用戶的密碼,所以第一個用於我,但另外兩個讓我感到困惑。

但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服務器(提供有關身份驗證的信息)

  • 用戶訪問webapp並單擊其提供商的登錄圖標(Google for ex)
  • webapp打開一個包含提供者登錄頁面和訪問頁面的彈出窗口,並指定返回到Api的return_to
  • 提供者向Api發送信息
  • Api通過check_authentication驗證這些信息
  • 如果無效,API會向webapp指示(每隔x秒詢問api)失敗
  • 如果有效,Api會向提供者詢問有關用戶的信息,例如電子郵件,顯示名稱等
  • 如果用戶存在,則創建會話
  • 如果用戶是新用戶,則將其添加到數據庫並創建會話
  • Api使用令牌會話返回auth的狀態(在本例中為成功),該會話將由Web應用程序用於進一步請求。

您真的不想使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM