聊一聊OAuth2.0

1.什麼是OAuth2.0

這裡應用阮一峰的文章中的一句話:OAuth 就是一種授權機制。數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(token),用來代替密碼,供第三方應用使用。

那麼為什麼需要授權機制,這裡引出另外一個詞:單點登錄( Single Sign On)SSO

單點登錄解決的是:在多個應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統。這也是為了解決多點登錄系統中,每個站點都實現了本站專用的帳號數據庫和登錄模塊。各站點的登錄狀態相互不認可,各站點需要逐一手工登錄的麻煩。

因而,通過一種授權機制來實現單點登錄。

2.OAuth2.0

OAuth 2.0 的標準是 RFC 6749 文件。該文件先解釋了 OAuth 是什麼。OAuth 的核心就是向第三方應用頒發令牌。

首先需要解釋幾個名詞:

客戶端(client)、資源所有者(Resource Owner)、資源服務器(Resource server)

聊一聊OAuth2.0

OAuth 2.0 規定了四種獲得令牌的流程。你可以選擇最適合自己的那一種,向第三方應用頒發令牌。下面就是這四種授權方式。

授權碼(authorization-code)

隱藏式(implicit)

密碼式(password)

客戶端憑證(client credentials)

聊一聊OAuth2.0

為什麼有這麼多方式,每一種方式,都有不同的應用環境。

首先說一下,目前最流行的方式:

授權碼(authorization code)方式,指的是第三方應用先申請一個授權碼,然後再用該碼獲取令牌。

適用於:那些有後端的 Web 應用。授權碼通過前端傳送,令牌則是儲存在後端,而且所有與資源服務器的通信都在後端完成。這樣的前後端分離,可以避免令牌洩漏。例如:通過微信,QQ,github登錄等。下圖是說明請求的簡單過程。

聊一聊OAuth2.0

response_type=code

實例:https://b.com/oauth/authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read

隱藏式:有些 Web 應用是純前端應用,沒有後端。這時就不能用上面的方式了,必須將令牌儲存在前端。RFC 6749 就規定了第二種方式,允許直接向前端頒發令牌。這種方式沒有授權碼這個中間步驟,所以稱為(授權碼)"隱藏式"(implicit)。

response_type=token

實例:https://b.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

聊一聊OAuth2.0

密碼式: 如果你高度信任某個應用,RFC 6749 也允許用戶把用戶名和密碼,直接告訴該應用。該應用就使用你的密碼,申請令牌,這種方式稱為"密碼式"(password)。

grant_type=password

https://b.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID

憑證式: 適用於沒有前端的命令行應用,即在命令行下請求令牌。

grant_type=client_credentials

https://b.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

今天就寫到,後面,可以通過github授權碼來實現登錄自己的系統。

注:上面圖片,來自網絡截圖,如有涉及到版權請聯繫刪除。上面參考了阮一峰有關OAuth2.0的博客,和楊波的文章等。


分享到:


相關文章: