<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們需要清楚 OAuth 是什麼?
OAuth 引入了一個授權層,用來分離兩種不同的角色:使用者端和資源所有者。......資源所有者同意以後,資源伺服器可以向用戶端頒發令牌。使用者端通過令牌,去請求資料。
上面這段話的意思就是:OAuth 的核心就是向第三方應用頒發令牌。
由於網際網路有多種場景,OAuth 2.0 規定了四種獲得令牌的流程,你可以選擇最適合自己的那一種,向第三方應用頒發令牌。
下面就是這四種授權方式。
注意,不管哪一種授權方式,第三方應用申請令牌之前,都必須先到系統備案,說明自己的身份,然後會拿到兩個身份識別碼:使用者端 ID(client ID)和使用者端金鑰(client secret)。
這是為了防止令牌被濫用,沒有備案過的第三方應用,是不會拿到令牌的。
授權碼(authorization code)方式,指的是第三方應用先申請一個授權碼,然後再用該碼獲取令牌。
這種方式是最常用的流程,安全性也最高,它適用於那些有後端的 Web 應用。授權碼通過前端傳送,令牌則是儲存在後端,而且所有與資源伺服器的通訊都在後端完成。這樣的前後端分離,可以避免令牌洩漏。
第一步,A 網站提供一個連結,使用者點選後就會跳轉到 B 網站,授權使用者資料給 A 網站使用。下面就是 A 網站跳轉 B 網站的一個示意連結。
https://b.com/oauth/authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read
上面 URL 中,response_type參數列示要求返回授權碼(code),client_id引數讓 B 知道是誰在請求,redirect_uri引數是 B 接受或拒絕請求後的跳轉網址,scope參數列示要求的授權範圍(這裡是唯讀)。
第二步,使用者跳轉後,B 網站會要求使用者登入,然後詢問是否同意給予 A 網站授權。使用者表示同意,這時 B 網站就會跳回redirect_uri引數指定的網址。跳轉時,會傳回一個授權碼,就像下面這樣。
https://a.com/callback?code=AUTHORIZATION_CODE
上面 URL 中,code引數就是授權碼。
第三步,A 網站拿到授權碼以後,就可以在後端,向 B 網站請求令牌。
https://b.com/oauth/token? client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL
上面 URL 中,client_id引數和client_secret引數用來讓 B 確認 A 的身份(client_secret引數是保密的,因此只能在後端發請求),grant_type引數的值是AUTHORIZATION_CODE,表示採用的授權方式是授權碼,code引數是上一步拿到的授權碼,redirect_uri引數是令牌頒發後的回撥網址。
第四步,B 網站收到請求以後,就會頒發令牌。具體做法是向redirect_uri指定的網址,傳送一段 JSON 資料。
{ "access_token":"ACCESS_TOKEN", "token_type":"bearer", "expires_in":2592000, "refresh_token":"REFRESH_TOKEN", "scope":"read", "uid":100101, "info":{...} }
上面 JSON 資料中,access_token欄位就是令牌,A 網站在後端拿到了。
有些 Web 應用是純前端應用,沒有後端。這時就不能用上面的方式了,必須將令牌儲存在前端。RFC 6749 就規定了第二種方式,允許直接向前端頒發令牌。這種方式沒有授權碼這個中間步驟,所以稱為(授權碼)"隱藏式"(implicit)。
第一步,A 網站提供一個連結,要求使用者跳轉到 B 網站,授權使用者資料給 A 網站使用。
https://b.com/oauth/authorize? response_type=token& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read
上面 URL 中,response_type引數為token,表示要求直接返回令牌。
第二步,使用者跳轉到 B 網站,登入後同意給予 A 網站授權。這時,B 網站就會跳回redirect_uri引數指定的跳轉網址,並且把令牌作為 URL 引數,傳給 A 網站。
https://a.com/callback#token=ACCESS_TOKEN
上面 URL 中,token引數就是令牌,A 網站因此直接在前端拿到令牌。
注意,令牌的位置是 URL 錨點(fragment),而不是查詢字串(querystring),這是因為 OAuth 2.0 允許跳轉網址是 HTTP 協定,因此存在"中間人攻擊"的風險,而瀏覽器跳轉時,錨點不會發到伺服器,就減少了洩漏令牌的風險。
這種方式把令牌直接傳給前端,是很不安全的。因此,只能用於一些安全要求不高的場景,並且令牌的有效期必須非常短,通常就是對談期間(session)有效,瀏覽器關掉,令牌就失效了。
如果你高度信任某個應用,RFC 6749 也允許使用者把使用者名稱和密碼,直接告訴該應用。該應用就使用你的密碼,申請令牌,這種方式稱為"密碼式"(password)。
第一步,A 網站要求使用者提供 B 網站的使用者名稱和密碼。拿到以後,A 就直接向 B 請求令牌。
https://oauth.b.com/token? grant_type=password& username=USERNAME& password=PASSWORD& client_id=CLIENT_ID
上面 URL 中,grant_type引數是授權方式,這裡的password表示"密碼式",username和password是 B 的使用者名稱和密碼。
第二步,B 網站驗證身份通過後,直接給出令牌。注意,這時不需要跳轉,而是把令牌放在 JSON 資料裡面,作為 HTTP 迴應,A 因此拿到令牌。
這種方式需要使用者給出自己的使用者名稱/密碼,顯然風險很大,因此只適用於其他授權方式都無法採用的情況,而且必須是使用者高度信任的應用。
最後一種方式是憑證式(client credentials),適用於沒有前端的命令列應用,即在命令列下請求令牌。
第一步,A 應用在命令列向 B 發出請求。
https://oauth.b.com/token? grant_type=client_credentials& client_id=CLIENT_ID& client_secret=CLIENT_SECRET
上面 URL 中,grant_type引數等於client_credentials表示採用憑證式,client_id和client_secret用來讓 B 確認 A 的身份。
第二步,B 網站驗證通過以後,直接返回令牌。
這種方式給出的令牌,是針對第三方應用的,而不是針對使用者的,即有可能多個使用者共用同一個令牌。
令牌的使用
A 網站拿到令牌以後,就可以向 B 網站的 API 請求資料了。
此時,每個發到 API 的請求,都必須帶有令牌。具體做法是在請求的頭資訊,加上一個Authorization欄位,令牌就放在這個欄位裡面。
curl -H "Authorization: Bearer ACCESS_TOKEN" "https://api.b.com"
上面命令中,ACCESS_TOKEN就是拿到的令牌。
更新令牌
令牌的有效期到了,如果讓使用者重新走一遍上面的流程,再申請一個新的令牌,很可能體驗不好,而且也沒有必要。OAuth 2.0 允許使用者自動更新令牌。
具體方法是,B 網站頒發令牌的時候,一次性頒發兩個令牌,一個用於獲取資料,另一個用於獲取新的令牌(refresh token 欄位)。令牌到期前,使用者使用 refresh token 發一個請求,去更新令牌。
https://b.com/oauth/token? grant_type=refresh_token& client_id=CLIENT_ID& client_secret=CLIENT_SECRET& refresh_token=REFRESH_TOKEN
上面 URL 中,grant_type引數為refresh_token表示要求更新令牌,client_id引數和client_secret引數用於確認身份,refresh_token引數就是用於更新令牌的令牌。
B 網站驗證通過以後,就會頒發新的令牌。
參考:OAuth 2.0
以上就是全面瞭解OAuth 2.0四種授權方式金三銀四無懼面試的詳細內容,更多關於OAuth 2.0面試四種授權方式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45