@TOC
一微驶、OAuth2.0是什么涌韩?
1.1 OAuth2.0簡(jiǎn)介
OAuth 2.0是目前最流行的授權(quán)機(jī)制锚贱,用來授權(quán)第三方應(yīng)用
OAuth是一種開放協(xié)議, 允許用戶讓第三方應(yīng)用以安全且標(biāo)準(zhǔn)的方式獲取該用戶在某一網(wǎng)站甜奄,移動(dòng)或者桌面應(yīng)用上存儲(chǔ)的秘密的資源(如用戶個(gè)人信息,照片推姻,視頻平匈,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用藏古。
OAuth 1.0協(xié)議(RFC5849)作為一個(gè)指導(dǎo)性文檔發(fā)布增炭,是一個(gè)小社區(qū)的工作成果。
本標(biāo)準(zhǔn)化規(guī)范在OAuth 1.0的部署經(jīng)驗(yàn)之上構(gòu)建拧晕,也包括其他使用案例以及從更廣泛的IETF社區(qū)收集到的可擴(kuò)展性需求隙姿。
OAuth 2.0協(xié)議不向后兼容OAuth 1.0。這兩個(gè)版本可以在網(wǎng)絡(luò)上共存厂捞,實(shí)現(xiàn)者可以選擇同時(shí)支持他們输玷。
1.2 OAuth2.0官方文檔
官網(wǎng):https://oauth.net/2/ 队丝,官網(wǎng)只有英文版文檔,您也可以參考翻譯過來的文檔欲鹏,鏈接:OAuth2 RFC6749中文翻譯
OAuth2.0在安全性方面做了比較大的提高机久,簡(jiǎn)單來說OAuth2.0就是一種授權(quán)協(xié)議,可以用來授權(quán)赔嚎,隨意點(diǎn)個(gè)網(wǎng)站膘盖,如圖這種網(wǎng)站,用戶不想注冊(cè)尤误,就可以用微信侠畔、支付寶登錄,就是場(chǎng)景是很常見的损晤,也是OAuth2.0的應(yīng)用
二践图、OAuth2.0原理
OAuth2.0是一種授權(quán)機(jī)制,正常情況沉馆,不使用OAuth2.0等授權(quán)機(jī)制的系統(tǒng),客戶端是可以直接訪問資源服務(wù)器的資源的德崭,為了用戶安全訪問數(shù)據(jù)斥黑,在訪問中間添加了Access Token機(jī)制∶汲客戶端需要攜帶Access Token去訪問受到保護(hù)的資源锌奴。所以O(shè)Auth2.0確保了資源不被惡意客戶端訪問,從而提高了系統(tǒng)的安全性憾股。
2.1 OAuth2.0流程圖
引用官方圖片介紹OAuth2.0總體流程:
- (A)客戶端向從資源所有者請(qǐng)求授權(quán)鹿蜀。
- (B)客戶端收到授權(quán)許可,資源所有者給客戶端頒發(fā)授權(quán)許可(比如授權(quán)碼code)
- (C)客戶端與授權(quán)服務(wù)器進(jìn)行身份認(rèn)證并出示授權(quán)許可(比如授權(quán)碼code)請(qǐng)求訪問令牌服球。
- (D)授權(quán)服務(wù)器驗(yàn)證客戶端身份并驗(yàn)證授權(quán)許可茴恰,若有效則頒發(fā)訪問令牌(accept token)。
- (E)客戶端從資源服務(wù)器請(qǐng)求受保護(hù)資源并出示訪問令牌(accept token)進(jìn)行身份驗(yàn)證斩熊。
- (F)資源服務(wù)器驗(yàn)證訪問令牌(accept token)往枣,若有效則滿足該請(qǐng)求。
三粉渠、 OAuth2.0的角色
OAuth2.0定義如下角色:
- 資源所有者(Resource Owner): 能夠許可受保護(hù)資源訪問權(quán)限的實(shí)體分冈。當(dāng)資源所有者是個(gè)人時(shí),它作為最終用戶被提及霸株。
- 用戶代理(User Agent): 指的的資源擁有者授權(quán)的一些渠道雕沉。一般指的是瀏覽器、APP
- 客戶端(Client) 使用資源所有者的授權(quán)代表資源所有者發(fā)起對(duì)受保護(hù)資源的請(qǐng)求的應(yīng)用程序去件。術(shù)語(yǔ)“客戶端”并非特指任何特定的的實(shí)現(xiàn)特點(diǎn)(例如:應(yīng)用程序是否在服務(wù)器坡椒、臺(tái)式機(jī)或其他設(shè)備上執(zhí)行)扰路。
- 授權(quán)服務(wù)器(Authorization Server): 在成功驗(yàn)證資源所有者且獲得授權(quán)后頒發(fā)訪問令牌給客戶端的服務(wù)器。
授權(quán)服務(wù)器和資源服務(wù)器之間的交互超出了本規(guī)范的范圍肠牲。授權(quán)服務(wù)器可以和資源服務(wù)器是同一臺(tái)服務(wù)器幼衰,也可以是分離的個(gè)體。一個(gè)授權(quán)服務(wù)器可以頒發(fā)被多個(gè)資源服務(wù)器接受的訪問令牌缀雳。- 資源服務(wù)器(Resource Server): 托管受保護(hù)資源的服務(wù)器渡嚣,能夠接收和響應(yīng)使用訪問令牌對(duì)受保護(hù)資源的請(qǐng)求。
四肥印、OAuth2.0授權(quán)模式
OAuth2.0有4種授權(quán)模式:
- 授權(quán)碼模式(authorization code)
- 簡(jiǎn)化模式(implicit)
- 密碼模式(resource owner password credentials)
- 客戶端模式(client credentials)
其中最常用的是授權(quán)碼模式识椰,4種授權(quán)模式的詳細(xì)介紹可以參考阮一峰老師的:OAuth 2.0 的四種方式
4.1 授權(quán)碼模式(authorization code)
授權(quán)碼(authorization code)方式,指的是第三方應(yīng)用先申請(qǐng)一個(gè)授權(quán)碼深碱,然后再用該碼獲取令牌腹鹉。
官網(wǎng)圖片:
從調(diào)接口方面,簡(jiǎn)單來說:
第一步:獲取code:
eg:oauthServer+"/oauth/authorize?client_id="+clientId+"&response_type=code&redirect_uri="+redirectUrl+"&scope=all"
如果沒有登錄敷硅,則會(huì)跳轉(zhuǎn)到統(tǒng)一身份認(rèn)證登錄頁(yè)面功咒。如果用戶登錄了,調(diào)用接口后绞蹦,會(huì)重定向到redirect_uri力奋,授權(quán)碼會(huì)作為它的參數(shù)第二步:獲取access_token
eg:oauthServer+"/oauth/token?code="+code+"&grant_type=authorization_code&client_secret="+clientSecret+"&redirect_uri="+redirectUri+"&client_id="+clientId
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk1MzQ5NzMsInVzZXJfbmFtZSI6Im5pY2t5IiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9hZG1pbiJdLCJqdGkiOiJmMjM0M2Q0NC1hODViLTQyOGYtOWE1ZS1iNTE4NTAwNTM5ODgiLCJjbGllbnRfaWQiOiJvYSIsInNjb3BlIjpbImFsbCJdfQ.LWkN2gC2dBrGTn5uSPzfdW6yRj7jhlX87EE8scY02hI",
"token_type": "bearer",
"expires_in": 59,
"scope": "all",
"user_name": "nicky",
"jti": "f2343d44-a85b-428f-9a5e-b51850053988"
}
- 第三步:訪問系統(tǒng)資源,此時(shí)統(tǒng)一認(rèn)證服務(wù)會(huì)根據(jù)該認(rèn)證客戶端權(quán)限信息判斷幽七,決定是否返回信息景殷。
訪問:http://localhost:8084/api/userinfo?access_token=${accept_token}
4.2 簡(jiǎn)化模式(implicit grant type)
簡(jiǎn)化模式(implicit grant type)不通過第三方應(yīng)用程序的服務(wù)器,直接在瀏覽器中向認(rèn)證服務(wù)器申請(qǐng)令牌澡屡,跳過了"授權(quán)碼"這個(gè)步驟猿挚,因此稱簡(jiǎn)化模式
從調(diào)接口方面,簡(jiǎn)單來說:
- 第一步:訪問授權(quán)驶鹉,要傳client_id:客戶端id绩蜻,redirect_uri:重定向uri,response_type為token梁厉,scope是授權(quán)范圍辜羊,state是其它自定義參數(shù)
- 第二步:授權(quán)通過,會(huì)重定向到redirect_uri词顾,access_token碼會(huì)作為它的參數(shù)
http://localhost:8084/callback#access_token=${accept_token}&token_type=bearer&state=123&expires_in=120
- 第三步:拿到acceptToken之后八秃,就可以直接訪問資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
4.3 密碼模式(resource owner password credentials)
密碼模式中,用戶向客戶端提供自己的用戶名和密碼肉盹,這通常用在用戶對(duì)客戶端高度信任的情況
從調(diào)接口方面昔驱,簡(jiǎn)單來說:
- 第一步:直接傳username,password獲取token
- 第二步:拿到acceptToken之后上忍,就可以直接訪問資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
4.4 客戶端模式(client credentials)
客戶端模式(client credentials)適用于沒有前端的命令行應(yīng)用骤肛,即在命令行下請(qǐng)求令牌
從調(diào)接口方面纳本,簡(jiǎn)單來說:
- 第一步: 獲取token
http://localhost:8888/oauth/token?client_id=cms&client_secret=123&grant_type=client_credentials&scope=all
- 第二步:拿到acceptToken之后,就可以直接訪問資源
http://localhost:8084/api/userinfo?access_token=${accept_token}
學(xué)習(xí)必要的理論知識(shí)后腋颠,還是實(shí)踐一下才能明白整個(gè)流程繁成,詳情參考我OAuth2.0系列博客專欄:OAuth2.0系列博客,SpringBoot的參考我系列博客專欄:SpringBoot系列博客