本系列文之後也會置於個人網站
先來回憶一下,何爲「授權」。試想像有一座宅邸,裏頭有無數房間。而你作爲這座宅邸的管家,擁有一把萬能鑰匙,可以開始宅邸內所有門扉。
此外,這把萬能鑰匙還有一個作用,就是產生出開啓特定門扉的鑰匙。
你可以產生出的鑰匙交給其他人,其他人就可以自由進出特定房間。這個動作就是「授權」。
OAuth 是一個開放標準的 授權協議 ,它允許 軟體應用 代表 資源擁有者 訪問資源擁有者的 資源 [^OAuth-2.0實戰]。
[^OAuth-2.0實戰]: OAuth 2.0實戰
OAuth 2.0 是一個授權協議,它允許軟體應用代表(而不是充當)資源擁有者去訪問資源擁
有者的資源。應用向資源擁有者請求授權,然後取得令牌(token),並用它來訪問資源。這一切
都不需要應用去充當資源擁有者的身份,因為令牌明確表示了被授予的訪問權。
-- OAuth 2.0 實戰
眾所周知,OAuth是一個安全協議,協議規範是這樣定義的:
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.[^RFC_6749]
OAuth 2.0 框架能讓第三方應用以有限的權限訪問HTTP服務,可以透過構建資源擁有者與HTTP服務間的許可交互機制,讓第三方應用代表資源擁有者訪問服務,或者通過授予權限給第三方應用,讓其代表自己訪問服務。[^OAuth-2.0實戰]
[^RFC_6749]: RFC 6749
作爲一個 授權框架 ,OAuth關注的是如何讓一個系統組件獲取對另一個系統組件的訪問權限。我們需要關心如下組件:
OAuth 2.0 規範定義了一個授權協議,用戶在Web應用以及API之間傳遞授權決策。因爲OAuth 2.0用於獲取已經通過身份驗證的最終用戶的許可,所以很多開發人員和API服務商認爲OAuth 2.0是一種讓用戶安全登入的身份認證協議。然後,儘管OAuth 2.0是宜個需要用戶交互的安全協議,但並不是身份認證協議。我門要明確地重申一遍:
OAuth 2.0 不是身份認證協議。
之所以會產生如此多的誤解,是因爲OAuth 2.0經常被用於身份認證協議內部,而常規的OAuth 2.0流程內部也會包含一些身份驗證事件。所以,很多開發人員看到這樣的OAuth 2.0流程,以爲使用OAuth就是執行身份驗證。這種想法不僅是錯誤的,而且會給服務提供商、開發人員和最終用戶帶來危險。
-- OAuth 2.0 實戰
開發人員試圖發明一個協議,允許用戶將API訪問授權出去。新的協議基於多個具有同樣思想的專有實現,包括Google的AuthSub以及Yahoo!的BBAuth。在這些實現中,客戶端應用只要獲得用戶的授權並得到一個權杖,就能夠使用這個權杖訪問遠端API。這些權杖的發放都包含公共和私有的部份,並且該協議使用了一種新型的(現在看來是脆弱的)加密簽名機制,使得它可以在非TLS HTTP連接上使用。他們稱為這個協議為OAuth 1.0,並將其作為一項Web開放標準發布,它很快獲得響應,出現了多種語言對這一標準的自由實現。這一標準表現優秀,深得開發人員喜愛,甚至一些大型網路公司也很快棄用了自己的專有機制,起初正是這些專有機制啟發了OAuth。
-- Justin Richer
OAuth 2.0 並不相容於 OAuth 1.0 。但相關概念最早始於2006年11月。現在看到的OAuth應該大多都直接是指 OAuth 2.0 。在2009年4月30日。 OAuth 1.0 被發現一個安全漏洞。同樣地, OAuth 2.0 可能也不是一個完美的協議,但從現實層面來看,今天的它非常流行,以至於開發者幾乎不能不知道。
除了由Chris Messina繪製並提交給社區OAuth的公共汽車乘車幣標誌。OAuth協議甚至還有一個超級酷的非官方吉祥物: OAuth碳 (OAuth-tan)
OAuth 無意用一個大而全的協議去解決安全系統所有方面的問題,而是只專註於一件事情,
把剩下的問題留給其他組件,讓它們各專所長。
-- OAuth 2.0 實戰
就是因爲這樣專注一件事,刻意糢糊部分,所以OAuth有非常高的彈性,適用於多種不同情境。但也相對的並不那麼容易理解,且實踐過程中還有可能踩入反模式,反而照成威脅。
OAuth是一個非常強大的工具,它的強大來自其靈活性,靈活性通常意味著它不僅能夠完成你的構想,而且也會帶來安全問題。OAuth管理API的訪問權限,守護著重要資料,所以最關鍵的是避免反模式,運用最佳實踐,以安全的方式使用它。換句話說,雖然它的靈活性能讓你可以以任何方式使用和部署它,但並不意味著你應該那樣隨意。
關於OAuth,還有一件要提到的事情——你不是為了用OAuth而去用它。你是想用它來做一些別的事情——很可能是要將一組API調用精心組合起來,以實現一個絕妙的點子。你或許正在頭腦中勾勒遺符完整的圖景,正思考如何實現自己的傑作。OAuth可以幫助你以更安全的方式實現它。
—-Ina Glazer, Saleforce公司身份管理高級總監
我們也差不多到入門篇的尾聲了,但我會強力建議你繼續閱讀之後的內容。畢竟:
與所有工具一樣,了解工具的工作原理及其優點非常重要。畢竟,用錘子雖然可以將螺絲釘打入牆壁,但用螺絲刀可能會更省力。希望你了解OAuth適用於哪些場景,同樣也了解它不適用於哪些場景。