OAuth,JWT ,OIDC你們搞得我好亂啊

hi,這里是桑小榆,這次分享的不是生活文,而是技術文。

基于OAuth2.0協議的授權認證,初次接觸授權認證知識的時候,出現了不少熱門名詞,“OAuth”,“JWT”,“OIDC”,這簡直讓人頭大,暈頭轉向甚至學了又不知道自己學了啥,網絡上看見相關的文章也是一頭霧水,要么是部分知識,要么是講著講著莫名其妙蹦出一個陌生詞。

b0b2fc9441e860585a514df7da575868.png

▲圖/?來源《功夫》

所以這次,本著大道至簡的思想,和大家一起探討,如果有看不懂的地方,那就是我沒理解或者講明白。本篇不包含源碼,先以理論基礎理解作為鋪墊,后篇將會以源碼實操的方式進行幫助理解。

首先我們回顧傳統的授權方式,基本是通過賬號,密碼的方式進行授權認證,授予第三方也是通過共享密碼的方式進行授權。隨著信息化的普及,系統越來越龐大,人人對于網絡觸手可及,這就容易帶來安全隱患。

第一,用戶授權第三方通過共享密碼,此處密碼也是明文的,顯然很不安全。

第二,我們給第三方的權限其實也就一小部分,如果通過密碼共享,則第三方通過你的密碼可以獲取所有的權限,這是不安全的。

第三,我們授權了第三方應用之后,我們是無法撤回權限的。只能通過更改密碼,那么我們授權的第三方都會受影響,非常麻煩且需要重新授權。

基于以上傳統授權方式的缺陷,于是引入了OAuth協議。協議,顧名思義就是大家(國際互聯組織)共同達成的一種標準的規則。這種協議,例如大家耳熟能詳的IP協議,TCP協議等都是共同制定的一種標準協議,防止各個國家或企業擁有自己的協議就容易造成協議泛濫,使用受限且對接繁雜。

OAuth協議,也屬于網絡層的協議,為了保護資源安全而存在。既然是協議,那必然需要一種傳輸介質,使得挨家挨戶都認識,且需要攜帶能夠識別身份的信息,那就是JWT(Json Web Token),也就是我們常說的Token令牌,關于JWT內容將在下篇探討。

那么,OAuth協議包含了哪些內容呢?

首先是四個主要的參與角色。

Resource Owner:資源所有者,對資源具有授權能力的人,也就是用戶。

Resource Server: 資源服務器,保存用戶信息的服務器并且能夠驗證令牌是否合法(比如說微信服務器,保存你的微信頭像,昵稱等)。

Client:客戶端,第三方應用,它獲得用戶的授權后便可以去訪問用戶的信息。比如嗶哩嗶哩。

Authorization Server:授權服務器,它將認證用戶的身份,為用戶提供授權審批流程,并最終頒發授權令牌(Access Token)。發送令牌給第三方的服務器(可以和資源服務器是同一個)

通過OAuth協議的幾個參與者,我們可以總結OAuth的作用,是讓用戶的權限,安全可控的授予第三方應用,第三方應用獲取到用戶授予的權限之后,與資源服務器進行交互。

其次,OAuth 支持四種授權模式。

由于客戶端必須得到用戶的授權(authorization grant),才能獲得令牌(access token)。因此OAuth支持獲得令牌的方式有四種。

授權碼模式(authorization code)

授權碼模式是比較標準的模式,微信、GitHub、嗶哩嗶哩等知名應用就是使用的這種模式,因為通過授權碼的方式可以有效的隱藏令牌不被泄露,安全性更高。

具體授權碼如何操作,我們可以舉個實際的例子:

4efa73ac294eef27c1bffaab45ffa726.png

▲圖/?來源B站登錄界面

比如,我們想登錄嗶哩嗶哩網站,嗶哩嗶哩提供了第三方登錄方式,微信,微博或者QQ登錄。

1.當我們選擇微信登錄的時候,嗶哩嗶哩會提供一個跳轉鏈接,我們點擊的時會跳轉到微信授權服務器。

//接口服務
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&redirect_uri=https%3A%2F%2Fpassport.bilibili.com%2Flogin%2Fsnsback%3Fsns%3Dwechat%26state%3D8b90df300a6711edbeb2d280ef8fddbc%26source%3Dnew_main_mini
&response_type=code&scope=snsapi_login
&state=authorize#wechat_redirect參數解釋:
appid:是微信端開放的授權標識,相當于client_id。
refirect_uri:回跳地址,微信生成授權碼code之后就會在這個鏈接上回傳給嗶哩嗶哩。
response_type:授權類型,此處為授權碼類型。
scope:授權范圍,此處為是授權給嗶哩嗶哩的授權api。
state:校驗參數,校驗用戶信息是否被篡改。

2.我們掃碼之后,微信服務器會詢問我們是否授權嗶哩嗶哩(將獲取你的昵稱、頭像)。

3.當我們點擊允許的時候,微信授權服務器就會針對當前操作的用戶返回一個授權碼給代理用戶,代理用戶就是指的瀏覽器,因為是瀏覽器幫我們去詢問授權的。

4.確認授權之后,代理用戶(瀏覽器)就會把這個授權碼通過重定向地址傳回給嗶哩嗶哩。

5.嗶哩嗶哩拿著這個授權碼和其他重要認證信息向微信授權服務器請求令牌。

6.微信授權服務器接收并識別這個授權碼之后發送一個令牌給嗶哩嗶哩。

7.嗶哩嗶哩拿著這個令牌就去獲取微信資源服務器讀取用戶資料。

40f94c5089a3be9289cdf261a6664ff5.png

▲圖/?授權碼模式圖解

隱式模式(不推薦使用),適合沒有后臺的第三方。

他的使用方式,我們還通過嗶哩嗶哩登錄的例子說明。

//接口服務
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&redirect_uri=https://www.blibli.com/callback
&response_type=token&scope=snsapi_login
&state=authorize#wechat_redirect

1.登錄嗶哩嗶哩時,會提供一個微信登錄的鏈接,我們點擊之后會跳轉到微信授權服務器。

2.進入之后,微信服務器會詢問我們是否授權嗶哩嗶哩,并確認授權給嗶哩嗶哩。

3.此時,微信授權服務器直接把令牌發送給了嗶哩嗶哩,嗶哩嗶哩根據令牌獲取用戶的信息。

我們發現,這個模式是沒有嗶哩嗶哩后臺認證與微信授權服務交互的過程,僅僅是拿到令牌之后返回到了嗶哩嗶哩的前臺。這種方式我們很容易通過鏈接進行存儲和偽造授權,是不安全的。

密碼模式,適合傳統的賬戶密碼系統改造為OAuth授權,以及用戶在很信任第三方的情況下使用。

//接口服務
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&grant_type=password
&username=sunny_100kmiles&rpassword=imluckyboy
&scope=snsapi_login
&state=authorize //wechat_redirect

1.該模式登錄嗶哩嗶哩時,嗶哩嗶哩會使用我們的賬號密碼直接向微信授權服務器索要令牌。

2.微信授權服務器接收到賬號密碼之后匹配成功則會發送令牌給嗶哩嗶哩。

3.嗶哩嗶哩根據令牌獲取我們的信息,但如果更改了密碼之后也需要重新刷新令牌。

客戶端模式,適合沒有前端的第三方,也沒有用戶的參與。僅僅是授權服務器與資源服務器之間的交互。

//接口服務
https://open.weixin.qq.com/connect/qrconnect
?appid=wxafc256bf83583323
&grant_type=client_credentials
&client_secret=xxxxxxxx

綜合以上四個授權模式,有些敏銳的小伙伴會發現,第一種整體來看較為復雜,為何要使用授權碼code去微信授權服務器獲取token(令牌)呢?直接在第四步,將token直接返回給客戶端嗶哩嗶哩,不是更加方便嗎?還減少了一次客戶端與授權服務器的交互,性能上也更優?

這種授權碼的設計方式也不難理解,如果直接將token(令牌)通過redirect_uri回調的方式返回給客戶端嗶哩嗶哩的話,也就是經過了代理用戶(瀏覽器)這一層,此時瀏覽器傳送的過程中很容易存到瀏覽器的cacher和log記錄中,也容易傳到其他惡意站點或者被截獲,這給攻擊者盜取令牌帶來了更多機會。

并且瀏覽器的redirect_uri本身就是一個不安全的信息通道,通常我們不會把重要,敏感的數據以這種方式傳遞。

因此,引入授權碼進行授權,OAuth協議經用戶授權之后生成一個code給嗶哩嗶哩客戶端,嗶哩嗶哩后臺將會根據這個code和其他重要信息(例如微信的appid,appsecrect等)向微信授權服務獲取令牌。這個時候我們會發現就算授權碼code被攻擊者截獲了也起不到任何的作用,大大提高了安全性。

那么,這種模式設計就無懈可擊了?顯然拿到令牌之后,向資源服務器請求交互的過程中,還是會被截獲token,甚至被篡改。

在OAuth1.0協議中,是通過反復的對授權碼code和token進行簽名,來保證token不會被篡改,但是OAuth2.0卻沒有這項,因為OAuth2.0是基于https的,我們知道https協議傳送的報文是加密的,不容易被篡改。顯然OAuth2.0在這基礎之上,性能上更優于OAuth1.0的。

還有一種存在的問題就是。用戶授權之后,授權碼code會通過redirect_uri進行傳回給嗶哩嗶哩客戶端,如果沒有對這串redirect_uri進行校驗,或者校驗規則級別不高。例如,嗶哩嗶哩提供的回調地址是www.blibli.com,但是被人截獲篡改成了www.clicli.com\www.blibli.com,那么這樣的授權就被www.clicli給劫走了。這就是跨站請求偽造。

由于這個授權服務器,嗶哩嗶哩客戶端和用戶之間有幾次交互,在得到授權碼的時候需要一次回跳,但是這次回跳是可以被阻塞的。

那么就會出現這樣的案例,比如我是黑客,我使用自己的賬號登錄嗶哩嗶哩進行第三方微信登錄,當我授權之后,微信授權服務會返回帶有授權碼code的回跳鏈接給嗶哩嗶哩客戶端,返回的過程中被我阻塞了,嗶哩嗶哩客戶端就收不到授權碼。

此時,我將這個跳轉鏈接發給正處于登錄狀態的用戶(小張)。

誘導小張進行正常點擊,那么我的賬號返回的授權碼鏈接就被小張點擊之后向微信服務器獲取令牌,那么此時我的第三方賬號和小張的賬號就已經綁定了,此時我相當于以小張的賬號進行登錄嗶哩嗶哩,進行刪除資源,刪除好友,取關等一系列惡意操作。

藝術來源于生活,這一點兒也不假。在網絡上看到過這樣的一起案例。

A女士前往ATM取錢,在插卡輸入密碼之后,后面排隊的B先生扔了幾張真鈔到A女士的腳旁誘導她去撿真鈔,B先生遂即切換A女士的卡將自己的卡插入ATM機,之后A女士發現需要重新登錄,輸入幾次密碼之后依然輸入錯誤,慌忙之中B先生建議A女士前往旁邊的前臺咨詢,于是便去了。在A女士連續輸入幾次密碼之后,早已被B先生記住了,支開A女士之后使用A女士的銀行卡進行操作。這一通引開注意,誘導操作是不是和剛剛的案例具有異曲同工之妙呢。

那么在程序里,基于OAuth2.0中是如何解決的呢?

回到上面授權碼模式給出的鏈接,你會發現參數中多了一個state參數,通過攜帶的state參數,嗶哩嗶哩就可以通過state進行校驗賬戶的信息是否被篡改。此時的state就相當于當前賬號的sessionid,或cookie的簽名串。

好了,以上我們探討了OAuth的設計原理以及作用。并且拋出了JWT(令牌)的作用和概念,下篇中會詳細講解JWT是如何帶著將令穿梭在端與端之間。

參考資料:

https://www.rfc-editor.org/rfc/rfc6749.html

https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

👇?更多有趣內容,請多關注!👇

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

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

相關文章

MyEclipse快捷鍵大全

存盤 Ctrls(肯定知道) 注釋代碼 Ctrl/ 取消注釋 Ctrl\(Eclipse3已經都合并到Ctrl/了) 代碼輔助 Alt/ 快速修復 Ctrl1 代碼格式化 CtrlShiftf 整理導入 CtrlShifto 切換窗口 Ctrlf6 <可改為ctrltab方便> ctrlshiftM 導入未引用的包 ctrlw 關閉單個窗口 F3 跳轉到類、變量的…

軟件測試技術第二次作業——程序錯誤的判斷

在做作業之前我們首先要明確軟件測試過程中的幾個名詞&#xff1a; Fault&#xff1a;在軟件測試中&#xff0c;fault是指程序中靜態的缺陷&#xff0c;也就是指在程序中存在的編程錯誤。 Error&#xff1a;在軟件測試中&#xff0c;error是指由于程序中存在的fault而產生的不正…

【GlobalMapper精品教程】006:Excel等表格(.xls)或文本(.txt .csv)坐標文件生成矢量點

【拓展閱讀】: 【QGIS入門實戰精品教程】4.5:QGIS打開Excel中的點坐標,并生成矢量文件 【ArcGIS微課1000例】0022:ArcGIS點(點坐標)自動連成線操作案例教程 【ArcGIS風暴】ArcGIS 10.2導入Excel數據X、Y坐標(經緯度、平面坐標),生成Shapefile點數據圖層 【ArcGIS風暴】…

Java編程思想 學習筆記1

一、對象導論 1.抽象過程   Alan Kay曾經總結了第一個成功的面向對象語言、同時也是Java所基于的語言之一的Smalltalk的五個基本特性&#xff0c;這些特性表現了純粹的面向對象程序設計方式   1&#xff09;萬物皆對象。   2&#xff09;程序是對象的集合&#xff0c;它們…

不只是日志收集,項目監控工具Sentry的安裝、配置、使用

前言上一篇文章介紹了ExceptionLess這個日志收集系統&#xff1a;ExceptionLess的安裝、配置、使用由于ExceptionLess官方提供的客戶端只有.Net/.NetCore平臺和js的&#xff0c;本文繼續介紹另一個日志收集系統&#xff1a;SentrySentry 是一個實時事件日志記錄和聚合平臺。&am…

64個數據分析常用術語

導讀&#xff1a;本篇文章&#xff0c;我們來講講數據分析常用語。 內容綜合整理自網絡 01 絕對數和相對數 絕對數&#xff1a;是反應客觀現象總體在一定時間、一定地點下的總規模、總水平的綜合性指標&#xff0c;也是數據分析中常用的指標。比如年GDP&#xff0c;總人口等等。…

redis 的bitmap 開源包 bitmapist的應用

2019獨角獸企業重金招聘Python工程師標準>>> 原理&#xff1a;http://my.oschina.net/u/1458120/blog/545224 bitmap包&#xff1a;https://github.com/Doist/bitmapist 要求redis> 2.6.0 bitmapist-master.zip 安裝自己下載解壓 python setup.py install &…

Django Views(視圖函數)

http請求中產生兩個核心對象&#xff1a; http請求&#xff1a;HttpRequest對象 http響應&#xff1a;HttpResponse對象 所在位置&#xff1a;django.http 之前我們用到的參數request就是HttpRequest 檢測方法&#xff1a;isinstance(request,HttpRequest) 1 HttpRequest對象…

Android 4 +https(如何啟動TLS1 1 and TLS1 2)

之前用的網絡請求框架是鴻洋的OkHttpUtils&#xff0c;網絡請求在5.0手機上使用https沒有問題&#xff0c;但是最近突然使用了一個4.4的系統&#xff0c;就報錯SSLException ....咋地咋地 然后 我們的副總給我們找一個博客&#xff0c;如何解決4.系統出現的這個問題&#xff0…

massCode 一款優秀的開源代碼片段管理器

本文將介紹一款適合程序員使用的個人代碼片段管理工具 massCode[1]。massCode小時候&#xff0c;也許我們每個人都會被老師要求有一個到處摘錄優美句子段落的作文素材本 —— 采蜜集。不可否認&#xff0c;這對我們的寫作水平的提高確實有很大的幫助。對開發人員來說當然也需要…

【ArcGIS Pro微課1000例】0021:Win10系統ArcGIS Pro3.0.1安裝教程(附ArcGIS Pro下載)

本文講解Win10系統上ArcGIS Pro3.0.1安裝教程,附軟件包下載。 文章目錄 一、 軟件安裝步驟1. 安裝.net Runtime 62. 安裝ArcGIS Pro3. 安裝中文語言4. 刪除代理二、軟件下載地址一、 軟件安裝步驟 [軟件名稱]: ArcGIS Pro 3.0.1 [軟件大小]:4.33GB [安裝環境]: Win 11/Win …

iOS逆向工程——非越獄調試

其實iOS的逆向分析業界已經十分成熟了&#xff0c;網上也有許多有趣的嘗試(一步一步實現iOS微信自動搶紅包(非越獄)。本文著重于如何在非越獄機器上進行調試&#xff0c;出于學習及總結的目的&#xff0c;記錄于此。 本文以破解游戲夢幻西游為例&#xff0c;逐步講解整個調試流…

[轉]2022 Flutter 宣布發布 Windows 正式版

原文鏈接&#xff1a; https://medium.com/flutter/announcing-flutter-for-windows-6979d0d01fed 自從推出 Flutter 以來&#xff0c;我們一直專注于為漂亮的定制應用提供跨平臺解決方案&#xff0c;這些應用被編譯為機器代碼并充分利用設備的底層圖形硬件功能。 今天這一愿景…

電腦經常彈出“不支持的硬件”解決辦法

電腦經常彈出“不支持的硬件”解決辦法。 通過微軟官方查證,這是由于以上處理器需要最新的Windows10系統才會這樣子的,而大多出現該提示的都安裝了Win7或是Win8.1系統。 來至微軟官方的說明 此錯誤出現的原因是各代新處理器要求最新Windows版本以獲得支持。 例如,Windows 1…

使用 Web API 上傳和下載多個文件

原文作者&#xff1a;Jay Krishna Reddy原文鏈接&#xff1a;https://www.c-sharpcorner.com/article/upload-and-download-multiple-files-using-web-api/翻譯&#xff1a;沙漠盡頭的狼&#xff08;谷歌翻譯加持&#xff0c;文中版本使用.NET 6升級&#xff09;---正文開始---…

詳解T-SQL的聯接機制

T-SQL的聯接分三種類型&#xff1a; 交叉聯接 ( cross join ) 內部聯接 (inner join) 外部聯接 (outer join) 每種聯接在邏輯上經歷不同的階段&#xff0c;分為笛卡爾乘積、篩選、添加外部行&#xff0c;如圖&#xff1a; 聯接類型 階段 交叉聯接 笛卡兒乘積 內部聯接…

Android FrameWork學習(一)Android 7 0系統源碼下載 編譯

最近計劃著研究下 Android 7.0 的系統源碼&#xff0c;之前也沒做過什么記錄&#xff0c;這次正好將學習的內容記錄下來&#xff0c;方便以后復習鞏固。 既然要學習我們的系統源碼&#xff0c;那我們第一步要做的就是下載源碼并進行編譯了。 #硬件環境要求 ###1. 編譯環境 按照…

【MapGIS精品教程】002:GDB本地數據庫的使用

本文主要內容為MapGISGDB本地數據庫的使用&#xff0c;包括&#xff1a;GDB企業管理器的認識、GDB本地數據庫的創建方法、GDB本地數據庫的備份和恢復。 1. GDB企業管理器的認識 GDB是地理數據的資源管理器&#xff0c;主要對空間數據進行有序組織與管理。 GDB數據管理包括&…

RabbitMQ學習3----運行和管理RabbitMQ

1.服務為管理 Erlang天生就是為了讓應用程序無需知道對方是否存在同一臺機器上即可互相通信。 Erlang節點&#xff1a;Erlang虛擬機的每個實例。多個Erlang應用程序可以運行在同一個節點之上。節點之間可以進行本地通信&#xff08;不管他們是運行在同一臺服務器之上&#xff0…