【OAuth2】授權框架的四種授權方式詳解

🎉🎉歡迎來到我的CSDN主頁!🎉🎉

🏅我是Java方文山,一個在CSDN分享筆記的博主。📚📚

🌟推薦給大家我的專欄《OAuth 2》。🎯🎯

👉點擊這里,就可以查看我的主頁啦!👇👇

Java方文山的個人主頁

🎁如果感覺還不錯的話請給我點贊吧!🎁🎁

💖期待你的加入,一起學習,一起進步!💖💖

請添加圖片描述

一、OAuth2的簡介

1.什么OAuth2

OAuth 2?是一種授權框架,允許第三方應用通過用戶授權的形式訪問服務中的用戶信息,最常見的場景是授權登錄;再復雜一點的比如第三方應用通過 Github 給開發者提供的接口訪問權限內的用戶信息或倉庫信息。OAuth2 廣泛應用于 web 、桌面應用、移動 APP 的第三方服務提供了授權驗證機制,以此實現不同應用間的數據訪問權限。 下面分別從不同角色、授權類型、使用場景及流程的緯度詳細介紹 OAuth2

2.OAuth Roles

OAuth 定義了四種角色

  • 資源擁有者 (Resource Owner)
  • 客戶端 (Client)
  • 資源服務器 (Resource Server)
  • 授權服務器 (Authorization Server)

資源擁有者其實就是真實的用戶,用戶授權給第三方應用訪問在其他系統的用戶信息。第三方應用訪問授權用戶的信息范圍?scope?屬于申請接入服務時選擇的權限之內(例如:讀或寫訪問權限)

資源服務控制用戶的信息,授權服務驗證用戶提供的信息是否正確并返回 access token 給第三方應用。 站在第三方開發者的角度看,被接入的系統提供的服務 API 同時實現了資源和授權角色。在這里把資源服務端和授權服務端統一為“服務角色或 API 角色”。

客戶端就是要求接入的第三方應用,獲取用戶在提供服務的系統的賬戶信息。對于客戶端而言,最終獲取到用戶在服務端的賬戶信息首先需要用戶授權,用戶授權后傳給提供服務端驗證成功之后返回 access token ,在通過 access token 請求提供服務的系統(在這里我們成為 API ,下文也是)獲取用戶在 API 中的賬戶信息。

3.授權流程

接下來文中提到的客戶端均為第三方應用,服務端均為被接入的服務。譬如拉勾網有微博登錄功能,那么拉勾網就是客戶端,微博就是服務端。

剛剛解釋了 OAuth 系統中角色的概念,接下來可以解釋整個授權的流程。

流程圖解釋:

  1. 用戶點擊客戶端提供的授權請求
  2. 客戶端請求服務的授權頁面呈現給用戶,用戶點擊確認授權后服務端返回授權許可憑證給客戶端
  3. 客戶端通過步驟二接收到的授權許可憑證及在服務端注冊的應用信息請求服務端
  4. 如果步驟三驗證通過服務端則返回 access token 給客戶端
  5. 客戶端通過第四步獲取的 access token 請求服務端獲取資源
  6. 如果服務端校驗 access token 成功,則返回指定資源給客戶端

以上步驟是 OAuth2 授權登錄的步驟,當然不同類型的授權許步驟會不一樣,下文會詳細逐一討論。

二、第三方應用創建

第三方接入某平臺的 OAuth 2 服務之前,通常需要在平臺提供的注冊網站(通常叫做 developer" or "API")新建一個應用,注冊成功之后平臺會生成應用的 ID 和密碼。 讀者可以訪問 Github 的開發中心看看,國內寫的規范的有?coding developer

在平臺的注冊頁面至少得提供如下信息

  • 應用名稱
  • 應用網址
  • 回調鏈接

回調域名的作用:用戶點擊同意按鈕之后,服務端向客戶端返回授權碼或 access token ,當然如果是禁止操作也需回調告知客戶端結果。

在 OAuth 2 服務提供平臺新建一個應用之后,平臺會提供一對客戶端 ID 和密碼作為客戶端憑證。客戶端 ID 是可以公開的字符串,用以構建授權請求鏈接;用戶授權之后,客戶端使用服務端的授權碼和平臺分配的密碼獲取 access token 。密碼應當妥善保管以免泄漏。

1.授權許可

在第一張授權流程圖中,前四步包含了獲取授權許可獲取 access token ,授權許可有四種類型,服務端返回哪種類型取決于客戶端在請求鏈接中構建的?response_type?參數。四種類型的授權許可有不同的應用場景:

  • 授權碼:通過授權碼,服務端通過 Ajax 把 access token 返回給客戶端
  • 隱式:用于移動 APP 或 web 應用(應用運行在用戶的設備上)
  • 用戶密碼憑證:同一個公司不同系統之間內部賬戶互聯互通,比如國內某社區的代碼托管系統通過社區的賬戶也可以登錄。
  • 客戶端憑證:第三方應用自身服務訪問提供 OAuth2 服務提供的平臺資源

1.1.授權碼 (Grant Type: Authorization Code)

授權碼是 OAuth2 授權最廣泛的方式,得益于平臺給第三方應用分配的 ID 和密碼都是隱藏在第三方應用的后端代碼中。因為授權碼是基于重定向的方式,要想使用授權碼的方式,第三方應用必須能夠調用用戶系統中的應用(譬如瀏覽器)、和提供一個接口接收平臺服務的回調獲取授權碼。

一步步解釋授權碼的流程圖

步驟一:構建獲取授權碼請求鏈接
下文提到的例子都是基于 digiterocean 的 OAuth2

第一步是構建一個請求 Auth Server 獲取授權碼的鏈接,向服務端發起請求

https://cloud.digitalocean.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

分解請求鏈接:

  • https://cloud.digitalocean.com/v1/oauth/authorize?表示服務端授權 endpoint
  • client_id?平臺分配給第三方應用的 ID
  • redirect_uri=CALLBACK_URL?第三方開發者在平臺新建第三方應用時填寫的回調 URL
  • response_type=code?指定服務端返回授權碼
  • scope=read?指定第三方應用請求權限類型
步驟二:用戶授權給第三方應用

當用戶點擊第一步構建的鏈接之后,在用戶已經登錄服務端之后才能點擊確認授權(譬如想通過微信登錄某個第三方網址,你必須首先已經登錄微博)。這是平臺會給用戶提供一個頁面給用戶確認是否授權。

步驟三:服務端給客戶端返回授權碼

當用戶點擊同意授權之后,服務端發起一個請求重定向到第三方平臺填寫的回調鏈接,且請求鏈接中同時包含了服務端生成的授權碼。

https://dropletbook.com/callback?code=AUTHORIZATION_CODE
步驟四:第三方應用請求服務端,獲取 access token

客戶端獲取到服務端返回的授權碼之后,接著使用授權碼和平臺分配的密碼請求服務端獲取服務端的 access token 。第三方應用后端代碼拼接的 URL 格式形似:

https://cloud.digitalocean.com/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

在這里需注意兩個參數,其一是?client_secret?沒有暴露出去,在第三方應用后端代碼中拼接請求鏈接;另一是 redirect_uri ,這里不是在平臺新建應用時填寫的回調鏈接,而是第三方應用已經實現的另一個 action 處理服務端返回 access token 的請求。

步驟五:第三方應用接收 access token

如果第四部客戶端發送的信息被服務端校驗成功,服務端則返回 access token ,有一些平臺同時也同時傳遞 refresh token 。返回的 json 信息形似:

{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{"name":"Mark E. Mark","email":"mark@thefunkybunch.com"}
}

至此,已經走完 oauth 2 授權碼的方式所有流程。在 access_token 沒有失效的前提下,可通過 access_token 可以訪問平臺服務端提供的資源。另外如果還提供了 refresh_token ,在 access_token 失效的情況下,可以通過 refresh_token 再次去獲取有效的 access_token 。

1.2.隱式 (Grant Type: Implicit)

相比授權碼的授權許可這種后端實現,隱式授權類型在應用于前端實現(移動客戶端或者瀏覽器),其缺陷就是并不保證平臺分配給第三方平臺的密碼憑證足夠安全。隱式授權同樣也是基于重定向的方式,但是?access_token 通過網頁重定向返回給第三方平臺而不是通過接口調用的方式?暴露了 access_token 在重定向鏈接中,這點和授權碼不同。另外,也不支持服務端校驗客戶端第三方應用密碼,只是依賴在平臺新建應用是填寫的回調鏈接。

隱式授權不支持 refresh_token

授權大概流程如下:用戶請求授權,同意授權后服務端把 access_token 拼接到回調鏈接上通過瀏覽器重定向到客戶端,然后客戶端獲取到 access_token

通過流程圖可看出在第三步和授權碼不同的是服務端重定向到網頁而不是通過接口把 access_token 返回給客戶端。

步驟一:構建隱式授權請求鏈接

與授權碼的步驟一差不多一致,只是?response_type?字段的參數值為?token

步驟二:用戶授權給第三方

與授權碼授權的步驟二完全一致

步驟三:通過服務端重定向鏈接,User-agent (瀏覽器或者 APP) 獲取 access_token

與授權碼不同的是,用戶點擊授權之后服務端通過把 access_token 通過網頁重定向到回調鏈接,客戶端通過重定向鏈接才能獲取到access_token ;而授權碼獲取 access_token是通過服務端通過 ajax 請求的形式直接訪問第三方應用的后端接口,把 access_token傳給第三方后端。

步驟三:前端根據重定向調整

前端瀏覽器重定向請求第三方平臺的后端

步驟五:第三方應用后端通過腳本獲取在重定向鏈接中的 access_token

第三方應用后端通過腳本獲取在重定向鏈接上的 access_token

步驟六:User-Agent 執行第三方應用后端返回的腳本把 access_token 返回給第三方平臺后端。

1.3用戶密碼憑證

用戶直接給第三方應用提供在提供服務端賬號密碼,獲取服務端的 access_token。這種授權方式常用于一個企業不同服務之間的賬號互聯互通。 用戶給第三方應用提供賬號密碼之后,客戶端發送 POST 請求給服務端獲取access_token

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

如果服務端校驗客戶端(第三方應用)傳過來的賬戶密碼正確,則把 access_token返回給客戶端,用戶授權完成。

1.4.客戶端憑證

這種授權方式常用于第三方應用想要更改自身在服務提供方注冊的應用信息,比如更改應用描述或回調鏈接地址。

第三方應用通過發送服務端分配的 ID 和密碼給后端校驗,POST 的 URL 格式形似:

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

Access Token 和 Refresh Token

第三方應用從服務提供平臺獲取到有效的 access_token 之后,即可根據平臺提供的接口訪問服務端的資源。

curl -X POST -H "Authorization: Bearer ACCESS_TOKEN""https://api.digitalocean.com/v2/$OBJECT"

如果服務提供平臺支持 refresh_token ,那么第三方應用的 access_token 失效之后,可通過 refresh_token 再次獲取有效的 access_token

例如 digitalocean 支持第三方應用通過 POST 請求再此獲取有效的 access_token

https://cloud.digitalocean.com/v1/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN 

請添加圖片描述?

到這里我的分享就結束了,歡迎到評論區探討交流!!

💖如果覺得有用的話還請點個贊吧 💖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536735.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go從0到1項目實戰體系二十二:gin構建一個http server

1. 構建一個http server: // api.test.com/topic/main.go: type Topic struct {Id int // 如果寫成小寫的,不能訪問,因為是私有的.Title string } func main() {data : make(map[string]interface{})data["name"] "david"data["age"…

TwIST算法MALTLAB主程序詳解

TwIST算法MALTLAB主程序詳解 關于TwIST算法的具體原理可以參考: 鏈接: https://ieeexplore.ieee.org/abstract/document/4358846 鏈接: https://blog.csdn.net/jbb0523/article/details/52193209 該算法的MATLAB源代碼: 鏈接: http://www.lx.it.pt/~bi…

tcp和udp協議分別是什么意思有什么區別?

TCP(傳輸控制協議)和UDP(用戶數據報協議)是兩種網絡傳輸協議,它們在網絡通信中有一些關鍵的區別。 連接性: TCP: 提供面向連接的服務。在通信之前,需要建立連接,數據傳輸…

Node.js(二)-模塊化

1. 模塊化的基本概念 1.1 什么是模塊化 模塊化是指解決一個復雜問題時,自頂向下逐層將系統拆分成若干模塊的過程。對于整個系統來說,模塊是可組合、分解和更換的單元。 1.2 編程領域中的模塊化 編程領域中的模塊化,就是遵守固定的規則&…

48V轉12V 300mA降壓芯片,60V耐壓、0.6A穩壓芯片帶ECO模式-AH590L

AH590L是一種48V轉12V 300mA降壓芯片,具有60V耐壓、0.6A穩壓電流的特點,并且還帶有ECO模式,是一種理想的開關電源解決方案。 AH590L是PWM模式 DC/DC降壓轉換器。TEL:l86*4884*3702*寬輸入電壓范圍4至60V適用于工業領域的廣泛應用…

有意思、好用的免費API分享

Facebook Games Services - Facebook Games Services 為游戲開發者提供了各種服務, 包括(但不限于) 成就 API, 分數 API, 應用通知, 請求, 游戲養成和 Facebook SDK for Unity.Google Play Games Services - Google Developers Games 網站提供了各種 API, SDK 和服務, 包括(但不…

AI安全綜述

1、引言 AI安全這個話題,通常會引伸出來圖像識別領域的對抗樣本攻擊。下面這張把“熊貓”變“猴子”的攻擊樣例應該都不陌生,包括很多照片/視頻過人臉的演示也很多。 對抗樣本的研究領域已經具備了一定的成熟性,有一系列的理論來論述對抗樣本…

解決jquery-1.11.0.js安全漏洞

摘要:這個文件被掃出安全漏洞有XSS攻擊等 ,其中一個比較著名的漏洞是在JQuery 1.6.2版本中發現的。該漏洞被稱為”attrFn"漏洞,它允許攻擊者通過特殊構造的代碼執行任意的JavaScript代碼。 一、統一解決方式: jQuery官網 官…

javafx實現復雜統計圖繪畫

JavaFX 是一個用于創建富互聯網應用程序 (Rich Internet Applications) 的軟件平臺,可以用于創建各種圖形和圖表。下面是一個示例代碼,演示如何使用 JavaFX 繪制復雜的統計圖。 import javafx.application.Application; import javafx.collections.FXCollections; import ja…

one wire(單總線)FPGA代碼篇

一.引言 單總線(OneWire)是一種串行通信協議,它允許多個設備通過一個單一的數據線進行通信。這個協議通常用于低速、短距離的數字通信,特別適用于嵌入式系統和傳感器網絡。 二.one wire通信優點缺點 優點: 單一數據線…

Unity程序向Web服務器發送數據

Unity程序向Web服務器發送數據 一、介紹二、HTTP協議三、新建Unity工程,創建腳本1.新建Unity工程,創建腳本WebManager.cs,將其指定給場景中的任意游戲體。2.在WebManager.cs中添加一個m_info屬性和OnGUI函數顯示UI: 四、GET請求在…

npm使用詳解(好吧好吧是粗解)

目錄 npm是什么? npm有什么用? npm安裝 在 Windows 上 在 macOS 上 在 Linux 上(使用 apt 包管理器為例) 驗證 npm 安裝成功: npm使用 1. 初始化項目: 2. 安裝和管理依賴: 3. 查看和…

【DataV】DataV組件庫——更新數據視圖不更新

參考文章:dataV組件庫——改變數據視圖不主動刷新 問題: 拿到后端數值就直接賦值了,但是視圖(頁面)沒有更新。 解決: 官方文檔介紹dataV里面的組件props均未設置deep監聽,刷新props時&#xf…

一個利用摸魚時間背單詞的軟件

大家好,我是 Java陳序員。 最近進入了考試季,各種考試,英語四六級、考研、期末考等。不知道大家的英語四六級成績怎么樣呢? 記得大學時,英語四級都是靠高中學習積累的老本才勉強過關。 而六級則是考了多次&#xff…

20231224解決outcommit_id.xml1 parser error Document is empty的問題

20231224解決outcommit_id.xml1 parser error Document is empty的問題 2023/12/24 18:13 在開發RK3399的Android10的時候,出現:rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

靜態HTTP的常見問題和解決方法

大家好,歡迎來到今天的“靜態HTTP大講堂”!今天我們要聊聊靜態HTTP的常見問題和解決方法。別小看這些問題哦,它們就像是那些頑皮的小妖精,時不時地給你的網站搞點惡作劇。不過別擔心,有我在,這些小妖精都得…

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png 寫這個工具是因為要使用傳奇的部分素材在COCOS2DX使用,但是COCOS2DX不支持BMP如果直接將BMP轉換到PNG的話,網上找到的工具都不支持透明色轉換。難道要用PS一個一個摳圖嗎?要累死所以寫了…

HBase 超大表遷移、備份、還原、同步演練手冊:全量快照 + 實時同步(Snapshot + Replication)不停機遷移方案

博主歷時三年精心創作的《大數據平臺架構與原型實現:數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行,點擊《重磅推薦:建大數據平臺太難了!給我發個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側二維…

如何選擇適合業務的負載均衡策略?

在分布式系統的高可用設計中,負載均衡非常關鍵,我們知道,分布式系統的特性之一就是支持快速擴展,那么集群擴展之后,服務請求如何從服務器列表中選擇合適的一臺呢?這就需要依賴負載均衡策略。 負載均衡在處…

免 費 搭 建 小程序商城,打造多商家入駐的b2b2c、o2o、直播帶貨商城

在數字化時代,電商行業正經歷著前所未有的變革。鴻鵠云商的saas云平臺以其獨特的架構和先進的理念,為電商行業帶來了全新的商業模式和營銷策略。該平臺涉及多個平臺端,包括平臺管理、商家端、買家平臺、微服務平臺等,涵蓋了pc端、…