2015-10-13 64 views
9

我有API。其中一些僅限於通過OAuth從第三方應用程序訪問。如何安全地從我的web應用程序訪問我自己的API?

我也有一個web應用程序。用戶可以登錄並查看他們的私人信息。

該API也是從Web應用程序調用的。我的問題是用安全措施訪問API的好方法是什麼。

1. Third party applications -> OAuth 

2. My own web application -> ??? 

我的Web應用程序使用會話ID進行身份驗證。我想用HTTP標頭傳輸會話標識可能是一種好方法,但我沒有信心。

對於〔實施例...

$ curl -X PUT \ 
     -H "X-Sample-Application-Id: "My own web application's ID" \ 
     -H "X-Sample-Session-Token: yeoql2dvn7whpm4tbe61viscv" \ 

如果API接收到這個請求,使用會話進行身份驗證,而不是OAuth的和識別用戶....

任何幫助將不勝感激。

感謝,

..我發現類似的問題

Questions About Consuming Your Own API with OAuth


UPDATE1

有人說JWT(JSON網絡令牌)是不錯的。

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html


UPDATE2

我可能能夠使用OAuth的 「資源所有者密碼憑據」

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/709.html

或者......「客戶端克雷德補助金「看起來好多了。

回答

9

我要對此進行詳細闡述,因爲這是一個很好的問題,周圍有很多困惑 - 在我這裏一無所知。

如果您試圖保護的API將被個人專門用於服務器端應用程序,而不是第三方開發人員,那麼我強烈建議您使用HTTP基本認證來保護您的API服務。

這種工作方式是超直截了當:

  • 對於你的用戶(一個或多個),生成API密鑰對(s)表示,由一個ID和祕密。 API密鑰與用戶名/密碼同義。只需使用UUID庫生成隨機ID/Secret值。
  • 當您針對您的API服務進行身份驗證時,請在HTTP授權標頭中提供這些API憑據以標識您自己。下面是它的外觀採用curl

    $捲曲--user我-API-keyid的:我的API密鑰祕密https://api.myservice.com/blah

什麼是偉大的關於基本驗證是:

  • 實現起來非常簡單。
  • 這是一個明確的標準。
  • 只要您通過HTTPS發出請求,並且您不公開您的API密鑰,則應該是安全的。

現在 - 如果你正在構建,你想從各種環境中(不僅僅是服務器端應用程序)驗證用戶的API服務,您真正需要使用的OAuth2協議。

這是它的設計目的。

OAuth2協議可以以各種方式對用戶進行身份驗證 - 但結果相當複雜。添加的OAuth到您的網站是一個挑戰,即使你使用流行的庫/等

這裏的OAuth的工作原理(快速擊穿):

密碼格蘭特

密碼在OAuth中流動是您交換訪問令牌(通常是JWT)的用戶名/密碼的地方。然後,您使用HTTP授權標頭中的訪問令牌標識您的API服務。

這是大多數人在使用Angular/React構建SPA時以及移動應用程序時所做的事情。

客戶證書授予

憑證流客戶是你交換訪問令牌的API密鑰(就像基本身份驗證)。然後,您使用HTTP授權標頭中的訪問令牌標識您的API服務。

這是人們在使用OAuth構建服務器端應用程序時所要做的。

的隱格蘭特

這種流動是你所看到的,當你登錄到Facebook這樣的一些地方。您點擊一個按鈕,重定向到其他網站以驗證/接受權限,最後您將返回到主站點,並使用Acccess Token來標識您自己。這不適用於API服務。

授權碼格蘭特

這種流動是完全一樣的隱性流動,除非你回一個授權代碼,你再換回你用自己的身份訪問令牌。這不適用於API服務。它稍微安全一些。

如果您打算使用OAuth,因爲您的用例,我強烈建議您查看Stormpath之類的身份驗證提供程序。他們將這些東西自動化,並解決了OAuth周圍的諸多複雜問題。

否則,給基本認證一個去吧!

+1

我很抱歉我遲到的迴應。你的建議很棒,我從來沒有想過這麼好的主意。最終我選擇了密碼授權類型,因爲我必須實施我們自己的移動應用程序。 (我們將爲第三方移動應用程序開發人員提供我們的API)而且,即使OAuth也非常複雜,但我可以找到一些庫。這對我也有好處。使用基本身份驗證可能需要自定義實現,不確定,但像創建表保存生成的密鑰和祕密。 – zono

+0

感謝您的解釋,我有一些關於密碼授權的問題。我已經構建了一個授權服務器,該服務器使用需要client_id和client_secret的基本認證來保護oauth /令牌,以便接受請求。但我怎樣才能保護client_secret?客戶端是一個Angular 2應用程序。有必要使用基本身份驗證來保護oauth/token uri? – Paolo

相關問題