簡述 OAuth 2.0 的運作流程

本文將以用戶使用 github 登錄網站留言為例,簡述 OAuth 2.0 的運作流程。

假如我有一個網站,你是我網站上的訪客,看了文章想留言表示「朕已閱」,留言時發現有這個網站的帳號才能夠留言,此時給了你兩個選擇:一個是在我的網站上注冊擁有一個新賬戶,然后用注冊的用戶名來留言;一個是使用 github 帳號登錄,使用你的 github 用戶名來留言。前者你覺得過于繁瑣,于是慣性地點擊了 github 登錄按鈕,此時 OAuth 認證流程就開始了。

需要明確的是,即使用戶剛登錄過 github,我的網站也不可能向 github 發一個什么請求便能夠拿到訪客信息,這顯然是不安全的。就算用戶允許你獲取他在 github 上的信息,github 為了保障用戶信息安全,也不會讓你隨意獲取。所以操作之前,我的網站與 github 之間需要要有一個協商。

本文轉自我的?個人博客?。

1. 網站和 Github 之間的協商

Github 會對用戶的權限做分類,比如讀取倉庫信息的權限、寫入倉庫的權限、讀取用戶信息的權限、修改用戶信息的權限等等。如果我想獲取用戶的信息,Github 會要求我,先在它的平臺上注冊一個應用,在申請的時候標明需要獲取用戶信息的哪些權限,用多少就申請多少,并且在申請的時候填寫你的網站域名,Github 只允許在這個域名中獲取用戶信息。

此時我的網站已經和 Github 之間達成了共識,Github 也給我發了兩張門票,一張門票叫做 Client Id,另一張門票叫做 Client Secret。

2. 用戶和 Github 之間的協商

用戶進入我的網站,點擊 github 登錄按鈕的時候,我的網站會把上面拿到的 Client Id 交給用戶,讓他進入到 Github 的授權頁面,Github 看到了用戶手中的門票,就知道這是我的網站讓他過來的,于是它就把我的網站想要獲取的權限擺出來,并詢問用戶是否允許我獲取這些權限。

// 用戶登錄 github,協商
GET https://github.com/login/oauth/authorize// 協商憑證
params = {client_id: "xxxx",redirect_uri: "http://my-website.com"
}

如果用戶覺得我的網站要的權限太多,或者壓根就不想我知道他這些信息,選擇了拒絕的話,整個 OAuth 2.0 的認證就結束了,認證也以失敗告終。如果用戶覺得 OK,在授權頁面點擊了確認授權后,頁面會跳轉到我預先設定的 redirect_uri 并附帶一個蓋了章的門票 code。

// 協商成功后帶著蓋了章的 code
Location: http://my-website.com?code=xxx

這個時候,用戶和 Github 之間的協商就已經完成,Github 也會在自己的系統中記錄這次協商,表示該用戶已經允許在我的網站訪問上直接操作和使用他的部分資源。

3. 告訴 Github 我的網站要來拜訪了

第二步中,我們已經拿到了蓋過章的門票 code,但這個 code 只能表明,用戶允許我的網站從 github 上獲取該用戶的數據,如果我直接拿這個 code 去 github 訪問數據一定會被拒絕,因為任何人都可以持有 code,github 并不知道 code 持有方就是我本人。

還記得之前申請應用的時候 github 給我的兩張門票么,Client Id 在上一步中已經用過了,接下來輪到另一張門票 Client Secret。

// 網站和 github 之間的協商
POST https://github.com/login/oauth/access_token// 協商憑證包括 github 給用戶蓋的章和 github 發給我的門票
params = {code: "xxx",client_id: "xxx",client_secret: "xxx",redirect_uri: "http://my-website.com"
}

拿著用戶蓋過章的 code 和能夠標識個人身份的 client_id、client_secret 去拜訪 github,拿到最后的綠卡 access_token。

// 拿到最后的綠卡
response = {access_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"scope: "user,gist"token_type: "bearer",refresh_token: "xxxx"
}

4. 用戶開始使用 github 帳號在我的頁面上留言

// 訪問用戶數據
GET https://api.github.com/user?access_token=e72e16c7e42f292c6912e7710c838347ae178b4a

上一步 github 已經把最后的綠卡 access_token 給我了,通過 github 提供的 API 加綠卡就能夠訪問用戶的信息了,能獲取用戶的哪些權限在 response 中也給了明確的說明,scope 為 user 和 gist,也就是只能獲取 user 組和 gist 組兩個小組的權限,user 組中就包含了用戶的名字和郵箱等信息了。

// 告訴我用戶的名字和郵箱
response = {username: "barretlee",email: "barret.china@gmail.com"
}

整個 OAuth2 流程在這里也基本完成了,文章中的表述很粗糙,比如 access_token 這個綠卡是有過期時間的,如果過期了需要使用 refresh_token 重新簽證。重點是讓讀者理解整個流程,細節部分可以閱讀 RFC6749 文檔

希望對你理解 OAuth 2.0 有幫助。(本文完)

轉載于:https://www.cnblogs.com/hustskyking/p/oauth2-introduce.html

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

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

相關文章

linux庫引入之動態庫靜態庫(生成和使用)

庫: 庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。就是將源代碼轉化為二進制格式的源代碼,相當于進行了加密,別人可以使用庫,但是看不到庫中的內容。 如何使用 用戶需要同時具有頭文件和庫。 頭文件…

InstallShield limited edition 生成單個 setup.exe 安裝文件

InstallShield limited edition 生成單個 setup.exe 安裝文件 1.vs里選中當前Setup項目, 2.在vs工具欄中"配置管理器"的下拉列表里,把"Debug"改為"SingleImage" 3.重新編譯 posted on 2016-01-14 09:45 NET未來之路 閱讀(...) 評論(...) 編輯 收…

ASP.NET中高級程序員 面試題

第一部分:互相介紹及了解1.請介紹一下你自己?包括工作經歷和項目經歷?2.請談一下你就最近的一個項目?你在其中的職責和負責的部分?第二部分:一、ASP.NET技術問題選擇性提問。一般可以選擇三五個。1. 簡要說一下.Net的編譯過程.2…

gettimeofday函數

定義&#xff1a; gettimeofday是計算機函數&#xff0c;使用C語言編寫程序需要獲得當前精確時間&#xff08;1970年1月1日到現在的時間&#xff09;&#xff0c;或者為執行計時&#xff0c;可以使用gettimeofday()函數。 使用方法&#xff1a; #include <sys/time.h> i…

SQL Server數據庫設置自動備份策略

一. 簡單介紹SQL Server自帶的維護計劃是一個非常有用的維護工具&#xff0c;能夠完成大部分的數據庫的維護任務.數據庫的備份也是日常工作中非常重要的一個環節。備份的方法非常的多.今天給大家介紹最簡單的一種方法: 直接通過SQL Server Management Studio的圖形界面去設置備…

C3P0在多線程下的maxPoolSize配置

ETL工具完畢的差點兒相同了。今天遇到一個問題。就是給C3P0配置了maxPoolSize為10。目的是想讓整個應用同一時候獲得的最大的Connection個數為10&#xff0c;可是在測試應用的這一部分之后&#xff0c;發現PostgreSQL端的鏈接遠遠超過10個。由于工具是多線程的。所以就想&#…

樹莓派外設開發編程

樹莓派外設開發接口文檔參考 wiringPi&#xff08;特定平臺&#xff0c;特定功能接口&#xff09; 庫&#xff08;linux 動態庫 靜態庫&#xff09; gcc demo1.c -lwiringPi //編譯時要加-lwiringPigpio -v //查看是否安裝wiringPi庫 gpio version: 2.50 Copyright (c) 2012-2…

Bootstrap 5款常用模板

篇文章中&#xff0c;我們已經編制了5款最好的 Bootstrap 4.0 主題模板清單&#xff0c;讓您可以用在下一個項目中&#xff0c;我們希望你能找到有用的。這些主題包含了所有必要的 HTML 和 CSS 為基礎的設計模板的版式&#xff0c;表單&#xff0c;按鈕&#xff0c;導航和其它界…

工作內外網同時連接方案

需求 工作的時候需要用到外網查詢資料&#xff0c;又需要用內網完成工作任務。不想來回切換網絡。 前提 外網使用無線&#xff0c;內網使用水晶頭接口。 方案 1.插入水晶頭接口&#xff08;效果是連接內網&#xff09;。 2.進入 → “控制面板\網絡和 Internet\網絡和共享中心”…

三種常用圖片格式的使用場景

GIF&#xff1a;1&#xff1a;256色2&#xff1a; 無損&#xff0c;編輯 保存時候&#xff0c;不會損失。3&#xff1a;支持簡單動畫。4&#xff1a;支持boolean透明&#xff0c;也就是要么完全透明&#xff0c;要么不透明JPEG&#xff1a;1&#xff1a;millions of colors2&am…

交叉編譯及樹莓派(或其他平臺)交叉編譯工具鏈的安裝

交叉編譯是什么&#xff1a; 交叉編譯是一個行為&#xff0c;是在一個平臺上生成另一個平臺上的可執行代碼。 比如&#xff1a;我們在windows上面編寫C51的代碼&#xff0c;并編譯成可執行代碼&#xff0c;如xx.hex,是在C51上面運行不是在windows上面運行。 同樣&#xff1a;我…

Delphi:ADOConnection連接SQLServer自動斷網問題解決

解決方法一&#xff1a;異常時關閉連接&#xff0c;WinXP&#xff0c;win7 32位大部分情況都是起作用的&#xff0c;不過在有些windows操作系統下&#xff08;如家庭版&#xff09;不起作用&#xff0c;不知為何&#xff1f; try //執行sql操作 except AdoConnection.close;//…

走近北京后廠村程序員的真實生活

來源&#xff1a;中新經緯北京的西北角是個特別的區域&#xff0c;這里匯集了眾多互聯網及IT企業&#xff0c;實力雄厚的上市公司將自家 logo 懸掛在大廈的頂端&#xff0c;而剛起步的創業公司也會選擇在這里租下一畝三分地。中關村、上地、西二旗、后廠村……它們成為了一個個…

帶wiringPi庫的交叉編譯

WiringPi的下載——網盤提取 鏈接&#xff1a;https://pan.baidu.com/s/1cPIt-xZLye1DAQjq2yKzeg 提取碼&#xff1a;35vt &#xff08;這個庫不是很好&#xff0c;鏈接的庫的格式不對&#xff0c;是宿主機的平臺&#xff0c;需要自己將樹莓派的wiringpi庫&#xff08;libwiri…

lintcode:最小編輯距離

最小編輯距離 給出兩個單詞word1和word2&#xff0c;計算出將word1 轉換為word2的最少操作次數。 你總共三種操作方法&#xff1a; 插入一個字符刪除一個字符替換一個字符樣例 給出 work1"mart" 和 work2"karma" 返回 3 解題 動態規劃解題 定義矩陣dp[][]…

這些代碼優化的方法,你都用過嗎?

來自&#xff1a;www.cnblogs.com/xrq730/代碼優化的最重要的作用應該是&#xff1a;避免未知的錯誤在代碼上線運行的過程中&#xff0c;往往會出現很多我們意想不到的錯誤&#xff0c;因為線上環境和開發環境是非常不同的&#xff0c;錯誤定位到最后往往是一個非常小的原因。然…

VMwareTool 安裝

VMwareTools的一些實用性 安裝后用戶可以從物理主機直接往虛擬機里面拖文件。 安裝后鼠標進入虛擬機后可以直接出來&#xff0c;不安裝的話要按CTRLALT才可以釋放鼠標。 安裝后可以解決Ubuntu主窗口分辨率不適應問題&#xff0c;用戶可以隨意改變虛擬機窗口大小&#xff0c;vm…

Yann LeCun, Geoffrey E. Hinton, and Yoshua Bengio

轉載于:https://www.cnblogs.com/hanhuilee/p/5221255.html

Ubuntu18.04的vim和ifconfig的安裝

安裝vim &#xff1a; 命令行中輸入&#xff1a;sudo apt-get install vim (ps:它會顯示讓你輸入密碼&#xff0c;不過你輸入的密碼不會回顯) 查看安裝是否成功輸入&#xff1a; vim -v 若出現以下情況&#xff1a; The following packages have unmet dependencies: vim : …

Http與WWW服務精解

TCP/IP 協議介紹在介紹 HTTP 協議之前&#xff0c;先簡單說一下TCP/IP協議的相關內容。TCP/IP協議是分層的&#xff0c;從底層至應用層分別為&#xff1a;物理層、鏈路層、網絡層、傳輸層和應用層&#xff0c;如下圖所示&#xff1a;從應用層至物理層&#xff0c;數據是一層層封…