在學(xué)習(xí)oauth2.0協(xié)議的時(shí)候,對(duì)于刷新令牌refresh token感覺(jué)很困惑。主要是為啥需要刷新令牌,以及刷新令牌是如何工作的,技術(shù)細(xì)節(jié)是啥?比如通過(guò)refresh token可以讓access token永久不過(guò)期嗎?
下面就針對(duì)這兩個(gè)問(wèn)題進(jìn)行詳細(xì)分析。
為什么需要刷新令牌
刷新令牌的生命周期
1. 授權(quán)服務(wù)頒發(fā)刷新令牌
2. 第三方服務(wù)使用刷新令牌
定時(shí)檢測(cè)方式和現(xiàn)場(chǎng)發(fā)現(xiàn)方式
3. 授權(quán)服務(wù)校驗(yàn)刷新令牌
1. 接收刷新令牌請(qǐng)求,驗(yàn)證基本信息
2. 重新生成訪問(wèn)令牌
為什么需要刷新令牌
如果access token超時(shí)時(shí)間很長(zhǎng),比如14天,由于第三方軟件獲取受保護(hù)資源都要帶著access token,這樣access token的攻擊面就比較大。
如果access token超時(shí)時(shí)間很短,比如1個(gè)小時(shí),那其超時(shí)之后就需要用戶再次授權(quán),這樣的頻繁授權(quán)導(dǎo)致用戶體驗(yàn)不好。
引入refresh token,就解決了【access token設(shè)置時(shí)間比較常,容易泄露造成安全問(wèn)題,設(shè)置時(shí)間比較短,又需要頻繁讓用戶授權(quán)】的矛盾。
刷新令牌的生命周期
1. 授權(quán)服務(wù)頒發(fā)刷新令牌
第三方軟件得到一個(gè)訪問(wèn)令牌的同時(shí),也會(huì)得到一個(gè)刷新令牌,refresh_token是與第三方軟件、用戶關(guān)聯(lián)在一起的
2. 第三方服務(wù)使用刷新令牌
什么時(shí)候來(lái)使用刷新令牌呢?
定時(shí)檢測(cè)方式
在第三方軟件收到訪問(wèn)令牌的同時(shí),也會(huì)收到訪問(wèn)令牌的過(guò)期時(shí)間expires_in。一個(gè)設(shè)計(jì)良好的第三方應(yīng)用,應(yīng)該將expires_in值保存下來(lái)并定時(shí)檢測(cè);如果發(fā)現(xiàn)expires_in即將過(guò)期,則需要利用refresh_token去重新請(qǐng)求授權(quán)服務(wù),以便獲取新的、有效的訪問(wèn)令牌。
現(xiàn)場(chǎng)發(fā)現(xiàn)方式
比如第三方軟件訪問(wèn)受保護(hù)資源的時(shí)候,突然收到一個(gè)訪問(wèn)令牌失效的響應(yīng),此時(shí)第三方軟件立即使用refresh_token來(lái)請(qǐng)求一個(gè)訪問(wèn)令牌,以便繼續(xù)代表用戶使用他的數(shù)據(jù)。
綜合來(lái)看的話,定時(shí)檢測(cè)的方式,需要額外開發(fā)一個(gè)定時(shí)任務(wù);而“現(xiàn)場(chǎng)”發(fā)現(xiàn),就沒(méi)有這種額外的工作量。具體采用哪一種方式,你可以結(jié)合自己的實(shí)際情況。不過(guò)呢,建議采用定時(shí)檢測(cè)這種方式,因?yàn)樗梢詭?lái)“提前量”,以便有更好的主動(dòng)性,而現(xiàn)場(chǎng)發(fā)現(xiàn)就有點(diǎn)被動(dòng)了。
3. 授權(quán)服務(wù)校驗(yàn)刷新令牌
第三方軟件發(fā)送請(qǐng)求
授權(quán)服務(wù)器會(huì)先比較grant_type和 refresh_token的值,確認(rèn)是請(qǐng)求刷新令牌的操作
1. 接收刷新令牌請(qǐng)求,驗(yàn)證基本信息
1)和頒發(fā)訪問(wèn)令牌前的驗(yàn)證流程一樣,這里我們也需要驗(yàn)證第三方軟件是否存在。
在使用刷新令牌的時(shí)候,也是需要應(yīng)用傳遞它的app_id和app_sercet的
2)驗(yàn)證刷新令牌是否存在,要保證傳過(guò)來(lái)的刷新令牌的合法性。
3)還需要驗(yàn)證刷新令牌是否屬于該第三方軟件。授權(quán)服務(wù)是將頒發(fā)的刷新令牌與第三方軟件、當(dāng)時(shí)的授權(quán)用戶綁定在一起的,因此這里需要判斷該刷新令牌的歸屬合法性。
2. 重新生成訪問(wèn)令牌
訪問(wèn)令牌access_token,其與第三方軟件、用戶,還有授權(quán)范圍scope綁定在一起。
在生成access_token的時(shí)候,要考慮下面的場(chǎng)景。
1)若access_token未超時(shí),那么進(jìn)行refresh_token有下面幾種方式:
不會(huì)改變access_token,但超時(shí)時(shí)間會(huì)刷新,相當(dāng)于續(xù)期access_token
更新access_token的值,我們建議【統(tǒng)一更新access_token的值】
在spring security oauth中,其處理方式是仍返回原access_token及refresh_token,但是并不會(huì)續(xù)期,expires_in保持原樣,所以我們看到下面的響應(yīng)
2)若access_token超時(shí)了,但是refresh_token未超時(shí),那么更新access_token的值,但是刷新令牌refresh_token呢?推薦刷新令牌是一次性的,使用之后就會(huì)失效。
注意:通過(guò)refresh_token刷新后,返回來(lái)assessToken和refresh_token,但refresh_token過(guò)期時(shí)間不會(huì)重新刷新。
3)若refresh_token也超時(shí)了,就需要將刷新令牌和訪問(wèn)令牌都放棄,相當(dāng)于回到了系統(tǒng)的初始狀態(tài),只能讓用戶小重新授權(quán)了。
謝謝關(guān)注張軍博客
本文為張軍原創(chuàng)文章,轉(zhuǎn)載無(wú)需和我聯(lián)系,但請(qǐng)注明來(lái)自張軍的軍軍小站,個(gè)人博客http://m.eyofj.com
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
