OAuth 2.0 的四種認(rèn)證方式學(xué)習(xí)理解

本文為學(xué)習(xí)多篇OAuth 2.0文章后總結(jié)筏餐。
具體授權(quán)碼模式請看 阮一峰老師講解 OAuth 2.0 的四種方式
https://tools.ietf.org/html/rfc6749
https://www.ixigua.com/6841902954690118155

1. 授權(quán)碼 - authorization code

客戶端換取授權(quán)碼姨伤,客戶端調(diào)用服務(wù)端使用授權(quán)碼換token,客戶端調(diào)用服務(wù)端使用token訪問資源
必須要有服務(wù)端
  • 授權(quán)碼模式是四種模式中最繁瑣也是最安全的一種模式。
  • client_id 存儲在前端
  • client_secret 存儲在服務(wù)器
  • 支持refresh token
  • 使用場景:第三方Web服務(wù)器端應(yīng)用與第三方原生App规惰,例如頭條微信授權(quán)登錄

授權(quán)碼請求

    response_type:(必傳)此時為"code"     
    appid:        (必傳)微信服務(wù)器下發(fā)的標(biāo)識第三方應(yīng)用的
    client_id:    (必傳)微信服務(wù)器下發(fā)的標(biāo)識第三方應(yīng)用的空厌,和appid根據(jù)要求可選
    redirect_uri: (必傳)授權(quán)成功后的重定向地址
    scope:(可選)標(biāo)識授權(quán)范圍
    state:(推薦)第三方應(yīng)用提供的一個字符串,微信授權(quán)服務(wù)器會原樣返回

1.請求授權(quán)碼(示例)

GET /authorize?
response_type=code&
appid=wxe9199d568fe57fdd&
client_id=wxe9199d568fe57fdd&
state=wilson&
redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&
scope=user,photo HTTP/1.1

2.授權(quán)碼根據(jù)重定向地址返回 (前端地址颖御?后臺api榄棵?)

    HTTP/1.1 302 Found
    Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=wilson

3.拿到授權(quán)碼以后,在 后端服務(wù)潘拱,直接向 微信授權(quán)服務(wù)器 請求令牌

https://xeixin.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
Screen Shot 2020-12-08 at 12.06.26 AM.png
e5991fc4f8ac4b46a78293e69605d871.png

案例:https://www.toutiao.com/a6643594372862444040/

2. 授權(quán)碼 "隱藏式" - implicit

客戶端讓用戶登錄授權(quán)服務(wù)器換token疹鳄,客戶端使用token訪問資源(只有客戶端,沒有服務(wù)端)
  • 支持refresh token
  • 使用場景:為web瀏覽器應(yīng)用設(shè)計芦岂。一般簡化模式用于沒有服務(wù)器端的第三方單頁面應(yīng)用瘪弓,因?yàn)闆]有服務(wù)器端就無法使用授權(quán)碼模式。

https://b.com/oauth/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
Screen Shot 2020-12-08 at 12.06.44 AM.png

3c17a3e57be749228eb9b24db7aab3a3.png

3. 密碼式 - password

用戶在客戶端提交賬號密碼換token禽最,客戶端使用token訪問資源
  • 不支持refresh token
  • 使用場景:為遺留系統(tǒng)設(shè)計腺怯。這種模式十分簡單,但是卻意味著直接將用戶敏感信息泄漏給了client川无,因此這就說明這種模式只能用于client是我們自己開發(fā)的情況下呛占。因此密碼模式一般用于我們自己開發(fā)的,第一方原生App或第一方單頁面應(yīng)用懦趋。
https://oauth.b.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID
Screen Shot 2020-12-08 at 12.07.01 AM.png

4. 客戶端憑證 - Client Credentials Grant

客戶端使用自己的標(biāo)識換token晾虑,客戶端使用token訪問資源
  • 不支持refresh token
  • 使用場景:為后臺api服務(wù)消費(fèi)者設(shè)計。一般用來提供給我們完全信任的服務(wù)器端服務(wù)愕够。
https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
Screen Shot 2020-12-08 at 12.07.20 AM.png
Screen Shot 2020-12-08 at 12.00.59 AM.png
Screen Shot 2020-12-08 at 12.01.18 AM.png

如何在移動App中使用OAuth 2.0走贪?

移動 App 可以分為兩類,一類是沒有 Server 端的 App 應(yīng)用惑芭,一類是有 Server 端的 App 應(yīng)用坠狡。
這兩類 App 在使用 OAuth 2.0 時的最大區(qū)別,在于獲取訪問令牌的方式:

  • 如果有 Server 端遂跟,就建議通過 Server 端和授權(quán)服務(wù)做交互來換取訪問令牌逃沿;
  • 如果沒有 Server 端婴渡,那么只能通過前端通信來跟授權(quán)服務(wù)做交互,比如隱式許可授權(quán)類型凯亮。當(dāng)然边臼,這種方式的安全性就降低了很多。也可以將一個“迷你”的 Web 服務(wù)器嵌入到 App 里面去假消,這樣就可以像 Web 應(yīng)用那樣來使用 OAuth 2.0 柠并。這樣的 App 通過監(jiān)聽運(yùn)行在 localhost 上的 Web 服務(wù)器 URI,就可以做到跟普通的 Web 應(yīng)用一樣的通信機(jī)制富拗。
    這里介紹另外一種 PKCE 協(xié)議臼予,全稱是 Proof Key for Code Exchange by OAuth Public Clients。在下面的流程圖中啃沪,為了突出第三方軟件使用 PKCE 協(xié)議時與授權(quán)服務(wù)之間的通信過程粘拾,我省略了受保護(hù)資源服務(wù)和資源擁有者的角色:
66648bff2d955b3d714ce597299fbf52.png

首先,App 自己要生成一個隨機(jī)的创千、長度在 43~128 字符之間的缰雇、參數(shù)為 code_verifier 的字符串驗(yàn)證碼;接著追驴,我們再利用這個 code_verifier械哟,來生成一個被稱為“挑戰(zhàn)碼”的參數(shù)code_challenge。那怎么生成這個 code_challenge 的值呢氯檐?OAuth 2.0 規(guī)范里面給出了兩種方法戒良,就是看 code_challenge_method 這個參數(shù)的值:

  • 一種 code_challenge_method=plain,此時 code_verifier 的值就是 code_challenge 的值冠摄;
  • 另外一種 code_challenge_method=S256糯崎,就是將 code_verifier 值進(jìn)行 ASCII 編碼之后再進(jìn)行哈希,然后再將哈希之后的值進(jìn)行 BASE64-URL 編碼河泳,如下代碼所示沃呢。
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

在第一步獲取授權(quán)碼 code 的時候,我們使用 code_challenge 參數(shù)拆挥。需要注意的是薄霜,我們要同時將 code_challenge_method 參數(shù)也傳過去,目的是讓授權(quán)服務(wù)知道生成 code_challenge 值的方法是 plain 還是 S256纸兔。

https://authorization-server.com/auth?
response_type=code&
app_id=APP_ID&
redirect_uri=REDIRECT_URI&
code_challenge=CODE_CHALLENGE&
code_challenge_method=S256

在第二步獲取訪問令牌的時候惰瓜,我們使用 code_verifier 參數(shù),授權(quán)服務(wù)此時會將 code_verifier 的值進(jìn)行一次運(yùn)算汉矿。那怎么運(yùn)算呢崎坊?就是上面 code_challenge_method=S256 的這種方式。
沒錯洲拇,第一步請求授權(quán)碼的時候奈揍,已經(jīng)告訴授權(quán)服務(wù)生成 code_challenge 的方法了曲尸。所以,在第二步的過程中男翰,授權(quán)服務(wù)將運(yùn)算的值跟第一步接收到的值做比較另患,如果相同就頒發(fā)訪問令牌。

POST 
https://api.authorization-server.com/token?
grant_type=authorization_code&
code=AUTH_CODE_HERE&
redirect_uri=REDIRECT_URI&
app_id=APP_ID&
code_verifier=CODE_VERIFIER

現(xiàn)在蛾绎,你就知道了我們是如何使用 code_verifier 和 code_challenge 這兩個參數(shù)的了吧昆箕。總結(jié)一下就是租冠,換取授權(quán)碼 code 的時候为严,我們使用 code_challenge 參數(shù)值;換取訪問令牌的時候肺稀,我們使用 code_verifier 參數(shù)值。

Keycloak介紹

Keycloak是為現(xiàn)代應(yīng)用和服務(wù)提供了開源IAM(Identity and Access Management)解決方案
https://www.keycloak.org/

openid/AppAuth-Android

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末应民,一起剝皮案震驚了整個濱河市话原,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诲锹,老刑警劉巖繁仁,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異归园,居然都是意外死亡黄虱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門庸诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捻浦,“玉大人,你說我怎么就攤上這事桥爽≈觳樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵钠四,是天一觀的道長盗扒。 經(jīng)常有香客問我,道長缀去,這世上最難降的妖魔是什么侣灶? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮缕碎,結(jié)果婚禮上褥影,老公的妹妹穿的比我還像新娘。我一直安慰自己阎曹,他們只是感情好伪阶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布煞檩。 她就那樣靜靜地躺著,像睡著了一般栅贴。 火紅的嫁衣襯著肌膚如雪斟湃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天檐薯,我揣著相機(jī)與錄音凝赛,去河邊找鬼。 笑死坛缕,一個胖子當(dāng)著我的面吹牛墓猎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赚楚,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼毙沾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宠页?” 一聲冷哼從身側(cè)響起左胞,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎举户,沒想到半個月后烤宙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭嘁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年躺枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供填。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡拐云,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捕虽,到底是詐尸還是另有隱情慨丐,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布泄私,位于F島的核電站房揭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晌端。R本人自食惡果不足惜捅暴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咧纠。 院中可真熱鬧蓬痒,春花似錦、人聲如沸漆羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亲轨,卻和暖如春趋惨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惦蚊。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工器虾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹦锋。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓兆沙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莉掂。 傳聞我的和親對象是個殘疾皇子葛圃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 上一篇文章[http://www.ruanyifeng.com/blog/2019/04/oauth_design...
    筆名輝哥閱讀 3,072評論 0 55
  • 上一篇文章介紹了 OAuth 2.0 是一種授權(quán)機(jī)制,主要用來頒發(fā)令牌(token)憎妙。本文接著介紹頒發(fā)令牌的實(shí)務(wù)操...
    haokeed閱讀 450評論 0 0
  • 其實(shí)微服務(wù)分布式認(rèn)證授權(quán)框架并不復(fù)雜装悲,網(wǎng)上的一些文章也是過于注重實(shí)踐,卻對這其中的原理解釋不多尚氛,希望我的這篇文章能...
    程序員王旺閱讀 5,061評論 0 3
  • 久違的晴天,家長會洞渤。 家長大會開好到教室時阅嘶,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗(yàn)载迄。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,495評論 16 22
  • 今天感恩節(jié)哎讯柔,感謝一直在我身邊的親朋好友。感恩相遇护昧!感恩不離不棄魂迄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評論 0 11