1.什麼是OAuth2
OAuth(開放授權)是一個開放標準,允許用戶授權第三方移動應用訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方移動應用或分享他們數據的所有內容,OAuth2.0是OAuth協議的延續版本,但不向後兼容OAuth 1.0即完全廢止了OAuth1.0。
2.應用場景
第三方應用授權登錄:在APP或者網頁接入一些第三方應用時,時長會需要用戶登錄另一個合作平臺,比如QQ,微博,微信的授權登錄。
原生app授權:app登錄請求後臺接口,爲了安全認證,所有請求都帶token信息,如果登錄驗證、請求後臺數據。
前後端分離單頁面應用(spa):前後端分離框架,前端請求後臺數據,需要進行oauth2安全認證,比如使用vue、react後者h5開發的app。
3.名詞定義
(1) Third-party application:第三方應用程序,本文中又稱"客戶端"(client),比如打開知乎,使用第三方登錄,選擇qq登錄,這時候知乎就是客戶端。
(2)HTTP service:HTTP服務提供商,本文中簡稱"服務提供商",即上例的qq。
(3)Resource Owner:資源所有者,本文中又稱"用戶"(user),即登錄用戶。
(4)User Agent:用戶代理,本文中就是指瀏覽器。
(5)Authorization server:認證服務器,即服務提供商專門用來處理認證的服務器。
(6)Resource server:資源服務器,即服務提供商存放用戶生成的資源的服務器。它與認證服務器,可以是同一臺服務器,也可以是不同的服務器。
4.運行流程
(A)用戶打開客戶端以後,客戶端要求用戶給予授權。
(B)用戶同意給予客戶端授權。
(C)客戶端使用上一步獲得的授權,向認證服務器申請令牌。
(D)認證服務器對客戶端進行認證以後,確認無誤,同意發放令牌。
(E)客戶端使用令牌,向資源服務器申請獲取資源。
(F)資源服務器確認令牌無誤,同意向客戶端開放資源。
5.四種授權模式
授權碼模式(authorization code)
簡化模式(implicit)
密碼模式(resource owner password credentials)
客戶端模式(client credentials)
6.授權碼模式
授權碼模式(authorization code)是功能最完整、流程最嚴密的授權模式。
(1)用戶訪問客戶端,後者將前者導向認證服務器,假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。
(2)客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向頁面鏈接。請求成功返回code授權碼,一般有效時間是10分鐘。
(3)認證服務器覈對了授權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向頁面鏈接。請求成功返回access Token和refresh Token。
7.簡化模式Implicit
適用於公開的瀏覽器單頁應用
Access Token直接從授權服務器返回(只有前端渠道)
不支持refresh tokens
假定資源所有者和公開客戶應用在同一個設備上
最容易受安全攻擊
8.用戶名密碼 Resource Owner Credentials
使用用戶名密碼登錄的應用,例如桌面App
使用用戶名/密碼作爲授權方式從授權服務器上獲取access token
一般不支持refresh token
假定資源擁有者和公開客戶子啊相同設備上
9.客戶端憑證 Client Credentials
適用於服務器見通信場景,機密客戶代表它自己或者一個用戶
只有後端渠道,使用客戶憑證獲取一個access token
因爲客戶憑證可以使用對稱或者非對稱加密,該方式支持共享密碼或者證書