日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OAuth2.0的四种授权方式

發布時間:2024/9/30 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OAuth2.0的四种授权方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在OAuth2.0中,OAuth2.0 provider負責保護暴露在外的資源,第三方應用客戶端Client可以獨立的或代表用戶Owner來訪問這些受保護的資源,provider提供token令牌的管理和驗證來實現此功能,還必須提供一個授權確認頁面,讓用戶Owner確認第三方Client是否可以訪問這些受保護的資源 。

令牌相較與密碼,有這些優勢:1.令牌是短期的,到期會自動失效 2.令牌可以被數據所有者撤銷,會立即失效 3.令牌有權限范圍(scope)。

關于OAuth可以關注 阮一峰講OAuth和江南一點雨講解OAuth

OAuth非常好的一點就是考慮了實際應用中的復雜場景,總結了四種授權方式(authorization grant ):

  • 授權碼(authorization-code)
  • 隱藏式(implicit)
  • 密碼式(password)
  • 客戶端憑證(client credentials)

注意,不管哪一種授權方式,第三方應用都必須先到系統申請客戶端 ID(client ID)和客戶端密鑰(client secret),還要填寫redirect_url。這是為了防止令牌被濫用,沒有備案過的第三方應用,是不會拿到令牌的。

授權碼模式

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

這種方式是最常用的流程,安全性也最高,它適用于那些有后端的 Web 應用。授權碼通過前端傳送,令牌則是儲存在后端,而且所有與資源服務器的通信都在后端完成。這樣的前后端分離,可以避免令牌泄漏。

第一步:A 網站提供一個鏈接,用戶點擊后就會跳轉到 B 網站,授權用戶數據給 A 網站使用。下面就是 A 網站跳轉 B 網站的一個示意鏈接

Get http://localhost:8080/oauth/authorize?response_type=code&client_id=client_2&redirect_uri=http://www.baidu.com&scope=select

第二步:跳轉后,B 網站會要求用戶登錄,然后詢問是否同意給予 A 網站授權。用戶表示同意,這時 B 網站就會跳回redirect_uri參數指定的網址。跳轉時,會傳回一個授權碼。`

https://www.baidu.com/?code=cDG0IN

第三步:A 網站拿到授權碼以后,就可以在后端,向 B 網站請求令牌

POST http://localhost:8080/oauth/token?client_id=client_2&client_secret=123456&grant_type=authorization_code&code=cDG0IN&redirect_uri=http://www.baidu.com

第四步:B 網站收到請求以后,就會頒發令牌

{ "access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":2592000,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":100101,"info":{...} }

根據access_token即可訪問資源服務器里的內容

GET http://localhost:8081/openApi/order/1 Accept: application/json Authorization: bearer access_token

隱藏式

有些 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

第二步,用戶跳轉到 B 網站,登錄后同意給予 A 網站授權。這時,B 網站就會跳回redirect_uri參數指定的跳轉網址,并且把令牌作為 URL 參數,傳給 A 網站

https://a.com/callback#token=ACCESS_TOKEN

注意,令牌的位置是 URL 錨點(fragment),而不是查詢字符串(querystring),這是因為 OAuth 2.0 允許跳轉網址是 HTTP 協議,因此存在"中間人攻擊"的風險,而瀏覽器跳轉時,錨點不會發到服務器,就減少了泄漏令牌的風險。

這種方式把令牌直接傳給前端,是很不安全的。因此,只能用于一些安全要求不高的場景,并且令牌的有效期必須非常短,通常就是會話期間(session)有效,瀏覽器關掉,令牌就失效了

密碼式

用戶把用戶名和密碼,直接告訴該應用。該應用就使用你的密碼,申請令牌,這種方式稱為"密碼式"(password)。這種方式需要用戶給出自己的用戶名/密碼,顯然風險很大,因此只適用于其他授權方式都無法采用的情況,而且必須是用戶高度信任的應用。
第一步,A 網站要求用戶提供 B 網站的用戶名和密碼。拿到以后,A 就直接向 B 請求令牌

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

第二步,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 網站驗證通過以后,就會頒發新的令牌。

總結

以上是生活随笔為你收集整理的OAuth2.0的四种授权方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。