工欲善其事必先利其器”,作為開發(fā)的程序員,好的軟件會(huì)使我們開發(fā)速度顯著提升。
比如備受開發(fā)者青睞的谷歌瀏覽器Chrome,Chrome的功能通過成千上萬的附加組件和擴(kuò)展功能進(jìn)行擴(kuò)展,讓開發(fā)者們可以在開發(fā)過程中運(yùn)用各種技巧測試網(wǎng)站和應(yīng)用程序。根據(jù)你的需要,并選擇完美的擴(kuò)展,你可以輕松地創(chuàng)建一個(gè)個(gè)性化的開發(fā)環(huán)境,這會(huì)大大提高你的開發(fā)效率。
本文列出了一些對開發(fā)者的最有用的、用戶友好和功能豐富的擴(kuò)展工具,開發(fā)者們可根據(jù)自己的需要進(jìn)行選擇。
1、網(wǎng)站分析工具 Wappalyzer
Wappalyzer 是一個(gè)實(shí)用的跨平臺(tái)網(wǎng)站分析工具,用于幫助開發(fā)者、研究者和設(shè)計(jì)者檢測網(wǎng)頁使用的是什么技術(shù),以更好地衡量自己的項(xiàng)目中該使用什么技術(shù)。Wappalyzer 的功能和 BuiltWith 類似,可檢測內(nèi)容管理系統(tǒng)(CMS),電子商務(wù)平臺(tái)、Web服務(wù)器、JavaScript框架和已安裝的分析工具等。
2、代碼特效圖 Marmoset
Marmoset 由一段 Nginx 代碼組成,可以在短短幾秒鐘內(nèi)幫助你制作漂亮的代碼截圖,輸出線框和標(biāo)記代碼。此外,您可以添加主題和其他效果,它支持多種常見及不常見的代碼語言類型,內(nèi)建大約數(shù)十種配色,制作好的圖片可以當(dāng)作電腦桌面壁紙使用,絕對是極客必備。這個(gè)簡單直觀的附件,用戶只需稍作了解,便在性能評分中毫不猶豫地給出令人垂涎的5星。
3、批量打開多個(gè)鏈接 Linkclump
Linkclump 是一款用來批量打開網(wǎng)頁多個(gè)鏈接的擴(kuò)展工具,只需要用鼠標(biāo)拖動(dòng)框選所有想要打開的鏈接,就能在 LinkClump 的新標(biāo)簽頁、窗口中一次性打開它們,還可以保存為書簽,復(fù)制到剪貼板,關(guān)鍵詞過濾(即包含的關(guān)鍵詞打開或者不打開),延遲打開,反向選擇打開鏈接等等。
4、清除歷史記錄 Click&Clean
在超過45,000條評論中能一直維持5分好評可不是件簡單的事,但Click&Clean 做到了!通過 Click&Clean插件,用戶可以選擇多種方式來清除Chrome中的歷史記錄。而Click&Clean的清理界面也設(shè)計(jì)的非常新潮,它只需點(diǎn)擊一下即可刪除鍵入的URL,緩存和Cookie以及下載和瀏覽歷史記錄。Click&Clean甚至還能刪除客戶端Web SQL數(shù)據(jù)庫,F(xiàn)lash Cookies (LSOs)等。這可是Google Chrome瀏覽器的第一個(gè)私人數(shù)據(jù)清理工具。
5、程序調(diào)試工具 Firebug Lite
Firebug 是站長和博主的必備網(wǎng)絡(luò)工具。它能對HTML頁面的代碼進(jìn)行分析,并能對網(wǎng)頁式樣元素提供實(shí)時(shí)預(yù)覽。它不是Firebug或Chrome Developer Tools的替代品,相反,它與這些工具巧妙結(jié)合使用,提供諸如HTML元素的豐富視覺效果,DOM元素和Box模型著色功能,實(shí)時(shí)編輯CSS屬性等,它還能對網(wǎng)站的性能進(jìn)行測試評估,提供對諸如載入時(shí)間等的分析。你可以進(jìn)入Chrome擴(kuò)展程序中心的Firebug頁面進(jìn)行下載安裝Chrome版的擴(kuò)展 Firebug Lite。
6、字體樂園 Font Playground
這是另一款非常有用的前端工具,字體樂園(Font Playground)讓在你的應(yīng)用或者網(wǎng)站上無需改變?nèi)魏螙|西而實(shí)驗(yàn)不同字體成為可能。你可以獲取到超過1000種免費(fèi)谷歌網(wǎng)頁字體,它能讓你在短短幾秒鐘內(nèi)預(yù)覽該字體的效果。
7、搜索圖片 Search by Image
搜索圖片是谷歌親生的方向圖片搜索插件,其授權(quán)你可以在網(wǎng)頁的任何圖片上使用谷歌搜索(比天眼靈活,親生就是不一樣),簡單的在圖片上點(diǎn)擊右鍵,然后選擇“找谷歌上找這種圖片”(Search Google with this image)。如果這是你經(jīng)常用的插件,你也可以通過添加點(diǎn)擊圖片搜索來快速使用這個(gè)功能。
8、天眼-反向圖片搜索 TinEye Reverse Image Search
第一個(gè)依賴圖片身份技術(shù)的反向圖片搜索引擎(以抗議關(guān)鍵字加密,元數(shù)據(jù)和水印)(編者:深深鄙視找來的好圖還要加水印的人),天眼能簡單的快速搜索到幾乎所有圖片原資源。它為每一張要搜索的圖片創(chuàng)建一個(gè)獨(dú)立標(biāo)識(shí),并且與數(shù)據(jù)庫中其他圖片的標(biāo)識(shí)進(jìn)行精確匹配(非類似匹配),包括已被編輯,壓縮,重定義大小了的匹配圖片。以此每周有上千萬的圖片被添加進(jìn)數(shù)據(jù)庫。
9、內(nèi)建技術(shù)構(gòu)建者 BuiltWith Technology Profiler
搞清楚一個(gè)網(wǎng)頁如何建立按鈕的點(diǎn)擊需要感謝內(nèi)建技術(shù)構(gòu)建者,一款不錯(cuò)的易用網(wǎng)頁建構(gòu)工具。在你點(diǎn)擊構(gòu)建圖標(biāo)后,這款控件能返回所有能在這個(gè)網(wǎng)頁運(yùn)用的技術(shù)。訪問“BuiltWith”網(wǎng)頁獲取更多信息,你也可以在“BuiltWith” 網(wǎng)頁添入url來探索那個(gè)網(wǎng)站使用的技術(shù)。
10、像素標(biāo)尺 Page Ruler
像素標(biāo)尺能為你在任何一個(gè)網(wǎng)頁顯示標(biāo)尺,它可以為任何你想要測量的頁面控件提供寬,高,位置(上,下,左,右)等信息。標(biāo)尺的大小,位置可以很容易地通過拖動(dòng)標(biāo)尺邊緣、改變靶心位置、或者在工具欄手動(dòng)更新標(biāo)尺大小和位置來做精確調(diào)整。像素標(biāo)尺同樣提供了一個(gè)“組件模式”,其會(huì)在你鼠標(biāo)移到組件上時(shí)顯示該組件輪廓。更贊的是,你可以瀏覽任何控件的父控件,子控件,同級(jí)控件。
希望上面提到的一些工具能夠提高你的開發(fā)效率。你肯定也有自己中意的工具,這些工具對你的開發(fā)工作來說是必不可少的。但是千萬不要貪多貪全,因?yàn)閿U(kuò)展工具太多反而會(huì)無從下手,不僅沒有真正起到助益作用,反而常常妨礙了正常的開發(fā)工作。
工欲善其事必先利其器”,作為開發(fā)的程序員,好的軟件會(huì)使我們開發(fā)速度顯著提升。
比如備受開發(fā)者青睞的谷歌瀏覽器Chrome,Chrome的功能通過成千上萬的附加組件和擴(kuò)展功能進(jìn)行擴(kuò)展,讓開發(fā)者們可以在開發(fā)過程中運(yùn)用各種技巧測試網(wǎng)站和應(yīng)用程序。根據(jù)你的需要,并選擇完美的擴(kuò)展,你可以輕松地創(chuàng)建一個(gè)個(gè)性化的開發(fā)環(huán)境,這會(huì)大大提高你的開發(fā)效率。
本文列出了一些對開發(fā)者的最有用的、用戶友好和功能豐富的擴(kuò)展工具,開發(fā)者們可根據(jù)自己的需要進(jìn)行選擇。
1、網(wǎng)站分析工具 Wappalyzer
Wappalyzer 是一個(gè)實(shí)用的跨平臺(tái)網(wǎng)站分析工具,用于幫助開發(fā)者、研究者和設(shè)計(jì)者檢測網(wǎng)頁使用的是什么技術(shù),以更好地衡量自己的項(xiàng)目中該使用什么技術(shù)。Wappalyzer 的功能和 BuiltWith 類似,可檢測內(nèi)容管理系統(tǒng)(CMS),電子商務(wù)平臺(tái)、Web服務(wù)器、JavaScript框架和已安裝的分析工具等。
2、代碼特效圖 Marmoset
Marmoset 由一段 Nginx 代碼組成,可以在短短幾秒鐘內(nèi)幫助你制作漂亮的代碼截圖,輸出線框和標(biāo)記代碼。此外,您可以添加主題和其他效果,它支持多種常見及不常見的代碼語言類型,內(nèi)建大約數(shù)十種配色,制作好的圖片可以當(dāng)作電腦桌面壁紙使用,絕對是極客必備。這個(gè)簡單直觀的附件,用戶只需稍作了解,便在性能評分中毫不猶豫地給出令人垂涎的5星。
3、批量打開多個(gè)鏈接 Linkclump
Linkclump 是一款用來批量打開網(wǎng)頁多個(gè)鏈接的擴(kuò)展工具,只需要用鼠標(biāo)拖動(dòng)框選所有想要打開的鏈接,就能在 LinkClump 的新標(biāo)簽頁、窗口中一次性打開它們,還可以保存為書簽,復(fù)制到剪貼板,關(guān)鍵詞過濾(即包含的關(guān)鍵詞打開或者不打開),延遲打開,反向選擇打開鏈接等等。
4、清除歷史記錄 Click&Clean
在超過45,000條評論中能一直維持5分好評可不是件簡單的事,但Click&Clean 做到了!通過 Click&Clean插件,用戶可以選擇多種方式來清除Chrome中的歷史記錄。而Click&Clean的清理界面也設(shè)計(jì)的非常新潮,它只需點(diǎn)擊一下即可刪除鍵入的URL,緩存和Cookie以及下載和瀏覽歷史記錄。Click&Clean甚至還能刪除客戶端Web SQL數(shù)據(jù)庫,F(xiàn)lash Cookies (LSOs)等。這可是Google Chrome瀏覽器的第一個(gè)私人數(shù)據(jù)清理工具。
5、程序調(diào)試工具 Firebug Lite
Firebug 是站長和博主的必備網(wǎng)絡(luò)工具。它能對HTML頁面的代碼進(jìn)行分析,并能對網(wǎng)頁式樣元素提供實(shí)時(shí)預(yù)覽。它不是Firebug或Chrome Developer Tools的替代品,相反,它與這些工具巧妙結(jié)合使用,提供諸如HTML元素的豐富視覺效果,DOM元素和Box模型著色功能,實(shí)時(shí)編輯CSS屬性等,它還能對網(wǎng)站的性能進(jìn)行測試評估,提供對諸如載入時(shí)間等的分析。你可以進(jìn)入Chrome擴(kuò)展程序中心的Firebug頁面進(jìn)行下載安裝Chrome版的擴(kuò)展 Firebug Lite。
6、字體樂園 Font Playground
這是另一款非常有用的前端工具,字體樂園(Font Playground)讓在你的應(yīng)用或者網(wǎng)站上無需改變?nèi)魏螙|西而實(shí)驗(yàn)不同字體成為可能。你可以獲取到超過1000種免費(fèi)谷歌網(wǎng)頁字體,它能讓你在短短幾秒鐘內(nèi)預(yù)覽該字體的效果。
7、搜索圖片 Search by Image
搜索圖片是谷歌親生的方向圖片搜索插件,其授權(quán)你可以在網(wǎng)頁的任何圖片上使用谷歌搜索(比天眼靈活,親生就是不一樣),簡單的在圖片上點(diǎn)擊右鍵,然后選擇“找谷歌上找這種圖片”(Search Google with this image)。如果這是你經(jīng)常用的插件,你也可以通過添加點(diǎn)擊圖片搜索來快速使用這個(gè)功能。
8、天眼-反向圖片搜索 TinEye Reverse Image Search
第一個(gè)依賴圖片身份技術(shù)的反向圖片搜索引擎(以抗議關(guān)鍵字加密,元數(shù)據(jù)和水印)(編者:深深鄙視找來的好圖還要加水印的人),天眼能簡單的快速搜索到幾乎所有圖片原資源。它為每一張要搜索的圖片創(chuàng)建一個(gè)獨(dú)立標(biāo)識(shí),并且與數(shù)據(jù)庫中其他圖片的標(biāo)識(shí)進(jìn)行精確匹配(非類似匹配),包括已被編輯,壓縮,重定義大小了的匹配圖片。以此每周有上千萬的圖片被添加進(jìn)數(shù)據(jù)庫。
9、內(nèi)建技術(shù)構(gòu)建者 BuiltWith Technology Profiler
搞清楚一個(gè)網(wǎng)頁如何建立按鈕的點(diǎn)擊需要感謝內(nèi)建技術(shù)構(gòu)建者,一款不錯(cuò)的易用網(wǎng)頁建構(gòu)工具。在你點(diǎn)擊構(gòu)建圖標(biāo)后,這款控件能返回所有能在這個(gè)網(wǎng)頁運(yùn)用的技術(shù)。訪問“BuiltWith”網(wǎng)頁獲取更多信息,你也可以在“BuiltWith” 網(wǎng)頁添入url來探索那個(gè)網(wǎng)站使用的技術(shù)。
10、像素標(biāo)尺 Page Ruler
像素標(biāo)尺能為你在任何一個(gè)網(wǎng)頁顯示標(biāo)尺,它可以為任何你想要測量的頁面控件提供寬,高,位置(上,下,左,右)等信息。標(biāo)尺的大小,位置可以很容易地通過拖動(dòng)標(biāo)尺邊緣、改變靶心位置、或者在工具欄手動(dòng)更新標(biāo)尺大小和位置來做精確調(diào)整。像素標(biāo)尺同樣提供了一個(gè)“組件模式”,其會(huì)在你鼠標(biāo)移到組件上時(shí)顯示該組件輪廓。更贊的是,你可以瀏覽任何控件的父控件,子控件,同級(jí)控件。
希望上面提到的一些工具能夠提高你的開發(fā)效率。你肯定也有自己中意的工具,這些工具對你的開發(fā)工作來說是必不可少的。但是千萬不要貪多貪全,因?yàn)閿U(kuò)展工具太多反而會(huì)無從下手,不僅沒有真正起到助益作用,反而常常妨礙了正常的開發(fā)工作。
免責(zé)聲明:內(nèi)容和圖片源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。
往講使用 spring security 等具體技術(shù)的資料已經(jīng)很多了,筆者這篇文章不打算寫框架和代碼的具體實(shí)現(xiàn),而是會(huì)討論認(rèn)證和授權(quán)的區(qū)別。然后會(huì)介紹一些被業(yè)界廣泛采用的技術(shù),最后會(huì)聊聊:怎么為 API 構(gòu)建選擇合適的認(rèn)證方式?
在一些互聯(lián)網(wǎng)公司的面試中,面試官往往會(huì)問這樣一個(gè)問題:“如果禁用瀏覽器 cookie,如何實(shí)現(xiàn)用戶追蹤和認(rèn)證?”
遺憾的是:依然有大量候選人答非所問,無法搞清楚 cookie 和 session 之間的區(qū)別。
而在工作中也有讓人驚訝的真實(shí)案例:把 user ID 存儲(chǔ)到 local storage 中當(dāng)做 token 使用,原因是他們聲稱棄用了 cookie 這種落后的東西;一個(gè)移動(dòng)端項(xiàng)目,服務(wù)器給出的 API 中需要客戶端模擬一個(gè) cookie,從而像瀏覽器中 ajax 那樣消費(fèi) API。
互聯(lián)網(wǎng)是基于 HTTP 協(xié)議構(gòu)建的,而 HTTP 協(xié)議因?yàn)楹唵瘟餍虚_來,但是 HTTP 協(xié)議是無狀態(tài)(通信層面上虛電路比數(shù)據(jù)報(bào)昂貴太多)的。為此人們?yōu)榱俗粉櫽脩粝氤隽烁鞣N辦法,包括 :cookie/session 機(jī)制、token、flash 跨瀏覽器 cookie 甚至瀏覽器指紋等。
把用戶身份藏在每一個(gè)地方(瀏覽器指紋技術(shù)甚至不需要存儲(chǔ)介質(zhì))
首先,認(rèn)證和授權(quán)是兩個(gè)不同的概念,為了讓我們的 API 更加安全和具有清晰的設(shè)計(jì),理解認(rèn)證和授權(quán)的不同就非常有必要了,它們在英文中也是不同的單詞。
認(rèn)證:是 authentication,指的是當(dāng)前用戶的身份——當(dāng)用戶登陸過后系統(tǒng)便能追蹤到他的身份做出符合相應(yīng)業(yè)務(wù)邏輯的操作。
即使用戶沒有登錄,大多數(shù)系統(tǒng)也會(huì)追蹤他的身份,只是當(dāng)做來賓或者匿名用戶來處理。認(rèn)證技術(shù)解決的是 “我是誰?”的問題。
授權(quán):與認(rèn)證不同,授權(quán)是 authorization,指的是什么樣的身份被允許訪問某些資源,在獲取到用戶身份后繼續(xù)檢查用戶的權(quán)限。
單一的系統(tǒng)授權(quán)往往是伴隨認(rèn)證來完成的,但是在開放 API 的多系統(tǒng)結(jié)構(gòu)下,授權(quán)可以由不同的系統(tǒng)來完成,例如 OAuth。授權(quán)技術(shù)是解決“我能做什么?”的問題。
實(shí)現(xiàn)認(rèn)證和授權(quán)的基礎(chǔ)是需要一種媒介(credentials)來標(biāo)記訪問者的身份或權(quán)利,在現(xiàn)實(shí)生活中每個(gè)人都需要一張身份證才能訪問自己的銀行賬戶、結(jié)婚和辦理養(yǎng)老保險(xiǎn)等,這就是認(rèn)證的憑證。
在古代軍事活動(dòng)中,皇帝會(huì)給出戰(zhàn)的將軍頒發(fā)兵符,下級(jí)將領(lǐng)不關(guān)心持有兵符的人,只需要執(zhí)行兵符對應(yīng)的命令即可。在互聯(lián)網(wǎng)世界中,服務(wù)器為每一個(gè)訪問者頒發(fā) session ID 存放到 cookie,這就是一種憑證技術(shù)。
數(shù)字憑證還表現(xiàn)在方方面面:SSH 登錄的密匙、JWT 令牌、一次性密碼等。
用戶賬戶也不一定是存放在數(shù)據(jù)庫中的一張表,在一些企業(yè) IT 系統(tǒng)中,對賬戶管理和權(quán)限有了更多的要求。所以,賬戶技術(shù) (accounting)可以幫助我們使用不同的方式管理用戶賬戶,同時(shí)具有不同系統(tǒng)之間共享賬戶的能力,例如:微軟的活動(dòng)目錄(AD),以及簡單目錄訪問協(xié)議(LDAP),甚至區(qū)塊鏈技術(shù)。
還有一個(gè)重要的概念是:訪問控制策略(AC)。如果我們需要把資源的權(quán)限劃分到一個(gè)很細(xì)的粒度,就不得不考慮用戶以何種身份來訪問受限的資源,選擇基于訪問控制列表(ACL)還是基于用戶角色的訪問控制(RBAC)或者其他訪問控制策略。
在流行的技術(shù)和框架中,這些概念都無法孤立的被實(shí)現(xiàn),因此在現(xiàn)實(shí)中使用這些技術(shù)時(shí),大家往往為一個(gè) OAuth2 是認(rèn)證還是授權(quán)這種概念爭論不休。
為了容易理解,我在文末附上了一份常見技術(shù)和概念的術(shù)語表。
下面,我會(huì)介紹在API開發(fā)中常常使用的幾種認(rèn)證和授權(quán)技術(shù):HTTP Basic AUthentication、HAMC、OAuth2,以及憑證技術(shù)JWT token。
你一定用過這種方式,但不一定知道它是什么。
在不久之前,當(dāng)你訪問一臺(tái)家用路由器的管理界面,往往會(huì)看到一個(gè)瀏覽器彈出表單,要求你輸入用戶密碼。
在這背后,當(dāng)用戶輸入完用戶名密碼后,瀏覽器幫你做了一個(gè)非常簡單的操作:
API 也可以非常簡單的提供 HTTP Basic Authentication 認(rèn)證方式,那么客戶端可以很簡單通過 Base64 傳輸用戶名和密碼即可:。
這種方式實(shí)現(xiàn)起來非常簡單,在大量場景下被采用。
當(dāng)然缺點(diǎn)也很明顯,Base64 只能稱為編碼,而不是加密 (實(shí)際上,無需配置密匙的客戶端并沒有任何可靠地加密方式,我們都依賴 TSL 協(xié)議)。
這種方式的致命弱點(diǎn)是:編碼后的密碼,如果明文傳輸則容易在網(wǎng)絡(luò)傳輸中泄露,在密碼不會(huì)過期的情況下,密碼一旦泄露,只能通過修改密碼的方式。
在我們對接一些 PASS 平臺(tái)和支付平臺(tái)時(shí),會(huì)要求我們預(yù)先生成一個(gè) access key(AK) 和 secure key(SK),然后通過簽名的方式完成認(rèn)證請求。這種方式可以避免傳輸 secure key,且大多數(shù)情況下簽名只允許使用一次,避免了重放攻擊。
這種基于 AK/SK 的認(rèn)證方式主要是利用散列的消息認(rèn)證碼 (Hash-based MessageAuthentication Code) 來實(shí)現(xiàn)的。因此,有很多地方叫 HMAC 認(rèn)證,實(shí)際上不是非常準(zhǔn)確。
HMAC 只是利用帶有 key 值的哈希算法生成消息摘要,在設(shè)計(jì) API 時(shí)有具體不同的實(shí)現(xiàn)。
HMAC 在作為網(wǎng)絡(luò)通信的認(rèn)證設(shè)計(jì)中作為憑證生成算法使用,避免了口令等敏感信息在網(wǎng)絡(luò)中傳輸。
基本過程如下:
為了讓每一次請求的簽名變得獨(dú)一無二,從而實(shí)現(xiàn)重放攻擊,我們需要在簽名時(shí)放入一些干擾信息。
在業(yè)界標(biāo)準(zhǔn)中有兩種典型的做法,質(zhì)疑/應(yīng)答算法(OCRA: OATH Challenge-Response Algorithm)、基于時(shí)間的一次性密碼算法(TOTP:Time-based One-time Password Algorithm)。
質(zhì)疑/應(yīng)答算法需要客戶端先請求一次服務(wù)器,獲得一個(gè) 401 未認(rèn)證的返回,并得到一個(gè)隨機(jī)字符串(nonce)。
將 nonce 附加到按照上面說到的方法進(jìn)行 HMAC 簽名,服務(wù)器使用預(yù)先分配的 nonce 同樣進(jìn)行簽名校驗(yàn),這個(gè) nonce 在服務(wù)器只會(huì)被使用一次,因此可以提供唯一的摘要。
為了避免額外的請求來獲取 nonce,還有一種算法是使用時(shí)間戳,并且通過同步時(shí)間的方式協(xié)商到一致,在一定的時(shí)間窗口內(nèi)有效(1分鐘左右)。
這里的只是利用時(shí)間戳作為驗(yàn)證的時(shí)間窗口,并不能嚴(yán)格的算作基于時(shí)間的一次性密碼算法。
標(biāo)準(zhǔn)的基于時(shí)間的一次性密碼算法在兩步驗(yàn)證中被大量使用,例如:Google 身份驗(yàn)證器不需要網(wǎng)絡(luò)通信也能實(shí)現(xiàn)驗(yàn)證(但依賴準(zhǔn)確的授時(shí)服務(wù))。
原理是:客戶端服務(wù)器共享密鑰然后根據(jù)時(shí)間窗口能通過 HMAC 算法計(jì)算出一個(gè)相同的驗(yàn)證碼。
TOTP 基本原理和常見廠商
OAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn),允許用戶授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方網(wǎng)站或分享他們數(shù)據(jù)的所有內(nèi)容。
OAuth 是一個(gè)授權(quán)標(biāo)準(zhǔn),而不是認(rèn)證標(biāo)準(zhǔn)。提供資源的服務(wù)器不需要知道確切的用戶身份(session),只需要驗(yàn)證授權(quán)服務(wù)器授予的權(quán)限(token)即可。
上圖只是 OAuth 的一個(gè)簡化流程,OAuth 的基本思路就是通過授權(quán)服務(wù)器獲取 access token 和 refresh token(refresh token 用于重新刷新access token),然后通過 access token 從資源服務(wù)器獲取數(shù)據(jù) 。
在特定的場景下還有下面幾種模式:
如果需要獲取用戶的認(rèn)證信息,OAuth 本身沒有定義這部分內(nèi)容,如果需要識(shí)別用戶信息,則需要借助另外的認(rèn)證層,例如: OpenID Connect。
在一些介紹OAuth 的博客中,很少講到:資源服務(wù)器是怎么驗(yàn)證 access token 的?
OAuth core 標(biāo)準(zhǔn)并沒有定義這部分,不過在 OAuth 其他標(biāo)準(zhǔn)文件中提到兩種驗(yàn)證 access token的方式。
1)在完成授權(quán)流程后,資源服務(wù)器可以使用 OAuth 服務(wù)器提供的 Introspection 接口來驗(yàn)證access token,OAuth服務(wù)器會(huì)返回 access token 的狀態(tài)以及過期時(shí)間。
在OAuth標(biāo)準(zhǔn)中驗(yàn)證 token 的術(shù)語是 Introspection。同時(shí),也需要注意 access token 是用戶和資源服務(wù)器之間的憑證,不是資源服務(wù)器和授權(quán)服務(wù)器之間的憑證。資源服務(wù)器和授權(quán)服務(wù)器之間應(yīng)該使用額外的認(rèn)證(例如:Basic 認(rèn)證)。
2)使用 JWT 驗(yàn)證:授權(quán)服務(wù)器使用私鑰簽發(fā) JWT 形式的 access token,資源服務(wù)器需要使用預(yù)先配置的公鑰校驗(yàn) JWT token,并得到 token 狀態(tài)和一些被包含在 access token 中信息。因此,在 JWT 的方案下,資源服務(wù)器和授權(quán)服務(wù)器不再需要通信,在一些場景下帶來巨大的優(yōu)勢。同時(shí),JWT 也有一些弱點(diǎn),我會(huì)在JWT 的部分解釋。
幾乎所有人剛開始了解 OAuth 時(shí)都有一個(gè)一疑問:為什么已經(jīng)有了 access token 還需要 refresh token 呢?
授權(quán)服務(wù)器會(huì)在第一次授權(quán)請求時(shí),一起返回 access token 和refresh token,在后面刷新 access token 時(shí)只需要 refresh token。
access token 和 refresh token 的設(shè)計(jì)意圖是不一樣的,access token 被設(shè)計(jì)用來客戶端和資源服務(wù)器之間交互,而 refresh token 是被設(shè)計(jì)用來客戶端和授權(quán)服務(wù)器之間交互。
某些授權(quán)模式下, access token 需要暴露給瀏覽器,充當(dāng)一個(gè)資源服務(wù)器和瀏覽器之間的臨時(shí)會(huì)話,瀏覽器和資源服務(wù)器之間不存在簽名機(jī)制,access token 成為唯一憑證。因此,access token 的過期時(shí)間(TTL)應(yīng)該盡量短,從而避免用戶的 access token 被嗅探攻擊。
由于要求 access token 時(shí)間很短,refresh token 可以幫助用戶維護(hù)一個(gè)較長時(shí)間的狀態(tài),避免頻繁重新授權(quán)。
大家會(huì)覺得讓 access token 保持一個(gè)長的過期時(shí)間不就可以了嗎?
實(shí)際上,refresh token 和 access token 的不同之處在于:即使 refresh token 被截獲,系統(tǒng)依然是安全的,客戶端拿著 refresh token 去獲取 access token 時(shí),同時(shí)需要預(yù)先配置的 secure key,客戶端和授權(quán)服務(wù)器之前始終存在安全的認(rèn)證。
認(rèn)證方面的術(shù)語實(shí)在太多,我在搭建自己的認(rèn)證服務(wù)器或接入第三方認(rèn)證平臺(tái)時(shí),有時(shí)候到完成開發(fā)工作的最后一刻都無法理解這些術(shù)語。
OAuth 負(fù)責(zé)解決分布式系統(tǒng)之間的授權(quán)問題,即使有時(shí)候客戶端和資源服務(wù)器或者認(rèn)證服務(wù)器存在同一臺(tái)機(jī)器上。OAuth 沒有解決認(rèn)證的問題,但提供了良好的設(shè)計(jì)利于和現(xiàn)有的認(rèn)證系統(tǒng)對接。
Open ID 解決的問題是:分布式系統(tǒng)之間身份認(rèn)證問題,使用Open ID token 能在多個(gè)系統(tǒng)之間驗(yàn)證用戶,以及返回用戶信息,可以獨(dú)立使用,與 OAuth 沒有關(guān)聯(lián)。
OpenID Connect 解決的是:在 OAuth 這套體系下的用戶認(rèn)證問題,實(shí)現(xiàn)的基本原理是將用戶的認(rèn)證信息(ID token)當(dāng)做資源處理。在 OAuth 框架下完成授權(quán)后,再通過 access token 獲取用戶的身份。
這三個(gè)概念之間的關(guān)系有點(diǎn)難以理解,用現(xiàn)實(shí)場景來說:如果系統(tǒng)中需要一套獨(dú)立的認(rèn)證系統(tǒng),并不需要多系統(tǒng)之間的授權(quán)可以直接采用 Open ID。
如果使用了 OAuth 作為授權(quán)標(biāo)準(zhǔn),可以再通過 OpenID Connect 來完成用戶的認(rèn)證。
在 OAuth 等分布式的認(rèn)證、授權(quán)體系下,對憑證技術(shù)有了更多的要求,比如:包含用戶 ID、過期等信息,不需要再外部存儲(chǔ)中關(guān)聯(lián)。
因此,業(yè)界對 token 做了進(jìn)一步優(yōu)化,設(shè)計(jì)了一種自包含令牌,令牌簽發(fā)后無需從服務(wù)器存儲(chǔ)中檢查是否合法,通過解析令牌就能獲取令牌的過期、有效等信息,這就是JWT (JSON Web Token)。
JWT 是一種包含令牌(self-contained token),或者叫值令牌 (value token),我們以前使用關(guān)聯(lián)到 session 上的 hash 值被叫做引用令牌(reference token)。
簡而言之,一個(gè)基本的JWT令牌為一段點(diǎn)分3段式結(jié)構(gòu)。
生成JWT 令牌的流程為:
因此,只需要簽名的 secret key 就能校驗(yàn) JWT 令牌,如果在消息體中加入用戶 ID、過期信息就可以實(shí)現(xiàn)驗(yàn)證令牌是否有效、過期了,無需從數(shù)據(jù)庫/緩存中讀取信息。因?yàn)槭褂昧思用芩惴ǎ缘谝弧⒍糠旨词贡恍薷模òㄟ^期信息)也無法通過驗(yàn)證。
JWT 優(yōu)點(diǎn)是:不僅可以作為 token 使用,同時(shí)也可以承載一些必要信息,省去多次查詢。
注意:
JWT token 在微服務(wù)的系統(tǒng)中優(yōu)勢特別突出:多層調(diào)用的 API 中可以直接傳遞 JWT token,利用自包含的能力,可以減少用戶信息查詢次數(shù);更重要的是,使用非對稱的加密方式可以通過在系統(tǒng)中分發(fā)密匙的方式驗(yàn)證 JWT token。
當(dāng)然,OAuth 對 access token 等憑證所選用的技術(shù)并沒有做出限制,OAuth 并不強(qiáng)制使用 JWT,在使用 JWT 自包含特性的優(yōu)勢時(shí),必須考慮到 JWT 撤回困難的問題。在一些對撤回 token 要求很高的項(xiàng)目中不適合使用JWT,即使采用了一些方案實(shí)現(xiàn)(whitelist 和 blacklist)也違背了設(shè)計(jì) JWT 的初衷。
在構(gòu)建 API 時(shí),開發(fā)者會(huì)發(fā)現(xiàn)我們的認(rèn)證方式和網(wǎng)頁應(yīng)用有一些不同,除了像 ajax 這種典型的 web 技術(shù)外,如果我們希望 API 是無狀態(tài)的,不推薦使用 Cookie。
使用 Cookie 的本質(zhì)是用戶第一次訪問時(shí)服務(wù)器會(huì)分配一個(gè) Session ID,后面的請求中客戶端都會(huì)帶上這個(gè) ID 作為當(dāng)前用戶的標(biāo)志。因?yàn)?HTTP 本身是無狀態(tài)的,Cookie 屬于一種內(nèi)建于瀏覽器中實(shí)現(xiàn)狀態(tài)的方式。如果我們的 API 是用來給客戶端使用的,強(qiáng)行要求 API 的調(diào)用者管理Cookie 也可以完成任務(wù)。
在一些遺留或者不是標(biāo)準(zhǔn)的認(rèn)證實(shí)現(xiàn)的項(xiàng)目中,我們依然可以看到這些做法,快速地實(shí)現(xiàn)認(rèn)證。
隨著微服務(wù)的發(fā)展,API 的設(shè)計(jì)不僅僅是面向 WEB 或者 Mobile APP,還有BFF(Backend for Frontend)和 Domain API 的認(rèn)證,以及第三方服務(wù)的集成。
客戶端到服務(wù)器之間認(rèn)證和服務(wù)器到服務(wù)器之間認(rèn)證是不同的。
我們把終端用戶(Human)參與的通信,叫做 Human-to-machine (H2M),服務(wù)器與服務(wù)器之間的通信叫做 Machine-to-machine (M2M)。
H2M 的通信需要更高的安全性,M2M 的通信天然比 H2M 安全,因此更多的強(qiáng)調(diào)性能,在不同的場合下選擇合適的認(rèn)證技術(shù)就顯得特別重要。例如: HTTP Basic Authentication 用來作為 H2M 認(rèn)證顯得有些落后,但是在 M2M 中被大量使用。
另外值得一提的是:H2M 這種通信方式下,客戶端不受控制,由于無法自主分發(fā)密匙,認(rèn)證通信的安全高度依賴 HTTPS。
從一個(gè)宏觀的角度看待他們的關(guān)系,對我們技術(shù)選型非常有幫助。
https://swagger.io/docs/specification/authentication/basic-authentication/
[HMAC: Keyed-Hashing for Message Authentication]( “https://www.ietf.org/rfc/rfc2104.txt “)
HOTP: An HMAC-Based One-Time Password Algorithm
OCRA: OATH Challenge-Response Algorithm
The OAuth 2.0 Authorization Framework
JSON Web Token (JWT)
OAuth 2.0
Internet-Draft Archive for OAuth
作者:ThoughtWorks林寧,微信公眾號(hào):ThoughtWorks洞見
本文由@ThoughtWorks林寧 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)允許,禁止轉(zhuǎn)載。
題圖來自Unsplash, 基于CC0協(xié)議
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。