大家都知道OAuth 2.0 有四種不同的grant type氏涩,分不同的業(yè)務(wù)場(chǎng)景來(lái)使用,我在前面的一篇文章也有粗略講過(guò) 微服務(wù)架構(gòu)學(xué)習(xí)筆記之一認(rèn)證和授權(quán) - 大概怎么去按照不同業(yè)務(wù)場(chǎng)景來(lái)使用OAuth 2.0的不同grant type, 比如下面這張圖
但是很多時(shí)候還是不能很好的理解為什么要這么劃分意系,關(guān)鍵點(diǎn)在哪里饺汹?這又回退到我們要清楚的知道OAuth 2.0 四種不同的grant type的區(qū)別是什么。
首先我們先羅列4種的OAuth 2.0的grant type
Authorization Code Flow
Implicit Flow
Resource Owner Password Credential Flow
Client Credential Flow
要回答這四種不同的grant type的區(qū)別是什么夸溶,需要考慮以下維度:
- 需不需要用戶輸入用戶名密碼凶硅?
- Client Application是第三方應(yīng)用還是第一方應(yīng)用?
- 用戶輸入用戶名和密碼的界面是誰(shuí)來(lái)提供的捷绑?Authorization Server還是第三方應(yīng)用编检?
- Client Application(需要訪問(wèn)你的資源的應(yīng)用)能否感知和存儲(chǔ)authorization code和access token?
對(duì)于第一個(gè)問(wèn)題扰才,4種grant type中只有client credential flow是不需要用戶輸入用戶名和密碼,這也就不難解釋為什么在只有機(jī)器執(zhí)行的場(chǎng)景下衩匣,那么就需要采用client credential flow這種OAuth 2.0的方式琅捏,只需要約定好client id和client secret就可以去換取access token來(lái)進(jìn)行resource的訪問(wèn)生百。這種業(yè)務(wù)場(chǎng)景一般發(fā)生在有些服務(wù)器需要定時(shí)執(zhí)行一些job的情況柄延。
對(duì)于第二個(gè)問(wèn)題,Client Application是第三方應(yīng)用還是第一方應(yīng)用市俊?一般來(lái)講滤奈,如果是第一方應(yīng)用(自己開(kāi)發(fā)的應(yīng)用)一般我們都認(rèn)為要安全一些,因?yàn)椴粫?huì)故意的去泄露訪問(wèn)resource的access token绅你, 所以一般第一方應(yīng)用我們可以使用簡(jiǎn)單的resource owner password credential flow, 這種OAuth 2.0 grant type 節(jié)省了通過(guò)code去交換access token這一步驟(實(shí)際上就是節(jié)省了一次網(wǎng)絡(luò)請(qǐng)求來(lái)回)昭躺,直接通過(guò)用戶名,密碼去獲取access token领炫。而第三方應(yīng)用我們需要采用更加安全的OAuth 2.0 flow, 比如authorization code flow 或者 implicit flow. 至于究竟是選擇authorization code flow 還是 implicit flow, 那么可以參見(jiàn)下面第四個(gè)問(wèn)題的回答。
對(duì)于第三個(gè)問(wèn)題针史, 這個(gè)也是出于安全性的考慮,我們可以看到啄枕,authorization code flow 和 implicit flow 的用戶輸入credential的界面都是由authorization server提供的H5 page,而resource owner password credential flow則是由client application提供的page (可以是Native App Page, 也可以是H5 Page), 由authorization server提供的H5 page會(huì)更加安全一點(diǎn)泌参。
對(duì)于第四個(gè)問(wèn)題常空,Client Application(需要訪問(wèn)你的資源的應(yīng)用)能否感知和存儲(chǔ)authorization code和access token? 我們都知道最常用的是authorization code flow,它是最安全的铣缠,它需要先通過(guò)用戶的身份驗(yàn)證昆禽,然后獲得一個(gè)code,再拿這個(gè)code去authorization server交換access token和refresh token醉鳖。而我們都知道access token本身是有時(shí)效性的,如果有人很容易的拿到code 或 refresh token壮韭,那么就基本上可以隨意隨時(shí)的去訪問(wèn)你的resource了纹因,因?yàn)樗梢圆粩嗟耐ㄟ^(guò)refresh token 去刷新access token。 而為什么第三方的SPA使用的是implicit flow 而第三方的Native App卻使用的是authorization code flow辐怕? 理論上第三方應(yīng)用都應(yīng)該使用authorization code flow,但是如果你仔細(xì)看下是牢,implicit flow中是沒(méi)有code 和 refresh token的陕截,而SPA應(yīng)用(本質(zhì)上是web,需要通過(guò)瀏覽器的)更加容易去暴露code 和 refresh token农曲, 所以才在第三方的SPA應(yīng)用中使用了implicit flow驻债,而只給了access token形葬, 一旦過(guò)期,則需要重新用戶名密碼驗(yàn)證淌实。