ASP.NET Core Web Api之JWT刷新Token(三)
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET Core Web Api之JWT刷新Token(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本節我們進入JWT最后一節內容,JWT本質上就是從身份認證服務器獲取訪問令牌,繼而對于用戶后續可訪問受保護資源,但是關鍵問題是:訪問令牌的生命周期到底設置成多久呢?
見過一些使用JWT的童鞋會將JWT過期時間設置成很長,有的幾個小時,有的一天,有的甚至一個月,這么做當然存在問題,如果被惡意獲得訪問令牌,那么可在整個生命周期中使用訪問令牌,也就是說存在冒充用戶身份,此時身份認證服務器當然也就是始終信任該冒牌訪問令牌
若要使得冒牌訪問令牌無效,唯一的方案則是修改密鑰,但是如果我們這么做了,則將使得已授予的訪問令牌都將無效,所以更改密鑰不是最佳方案,我們應該從源頭盡量控制這個問題,而不是等到問題呈現再來想解決之道,刷新令牌閃亮登場。
同時,若通過刷新令牌獲取新的訪問令牌驗證其無效可將受訪者納入黑名單限制其訪問,那么訪問令牌和刷新令牌的生命周期設置成多久合適呢?這取決于系統要求的安全性,一般來講訪問令牌的生命周期不會太長,比如5分鐘,又比如獲取微信的AccessToken的過期時間為2個小時。
接下來我將用兩張表來演示實現刷新令牌的整個過程,可能有更好的方案,歡迎在評論中提出,學習,學習。我們新建一個http://localhost:5000的WebApi用于身份認證,再新建一個http://localhost:5001的客戶端,首先點擊【模擬登錄獲取Toen】獲取訪問令牌和刷新令牌,然后點擊【調用客戶端獲取當前時間】,如下:
那么問題來了。我們怎么知道訪問令牌已經過期了呢?這是其一,其二是為何要發送舊的訪問令牌去獲取新的訪問令牌呢?直接通過刷新令牌去換取不行嗎?有問題是好的,就怕沒有任何思考,我們一一來解答。我們在客戶端添加JWT中間件時,里面有一個事件可以捕捉到訪問令牌已過期(關于客戶端配置JWT中間件第一節已講過,這里不再啰嗦),如下:通過如上事件并捕捉訪問令牌過期異常,這里我們在響應頭添加了一個自定義鍵act,值為expired,因為一個401只能反映未授權,并不能代表訪問令牌已過期。當我們在第一張圖中點擊【調用客戶端獲取當前時間】發出Ajax請求時,如果訪問令牌過期,此時在Ajax請求中的error方法中捕捉到,我們在如上已給出發出Ajax請求的error方法中繼續進行如下補充:到了這里我們已經解決如何捕捉到訪問令牌已過期的問題,接下來我們需要做的則是獲取刷新令牌,直接通過刷新令牌換取新的訪問令牌也并非不可,只不過還是為了安全性考慮,我們加上舊的訪問令牌。接下來我們發出Ajax請求獲取刷新令牌,如下:發出Ajax請求獲取刷新令牌的方法我們傳入了一個函數,這個函數則是上一次調用接口訪問令牌過期的請求,點擊【調用客戶端獲取當前時間】按鈕的Ajax請求error方法中,最終演變成如下這般:接下來則是通過傳入舊的訪問令牌和刷新令牌調用接口換取新的訪問令牌,如下:如上通過傳入舊的訪問令牌驗證并獲取用戶身份,然后驗證刷新令牌是否已經過期,如果未過期則創建新的訪問令牌,同時更新刷新令牌。最終客戶端訪問令牌過期的那一刻,通過刷新令牌獲取新的訪問令牌繼續調用上一請求,如下:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
見過一些使用JWT的童鞋會將JWT過期時間設置成很長,有的幾個小時,有的一天,有的甚至一個月,這么做當然存在問題,如果被惡意獲得訪問令牌,那么可在整個生命周期中使用訪問令牌,也就是說存在冒充用戶身份,此時身份認證服務器當然也就是始終信任該冒牌訪問令牌
若要使得冒牌訪問令牌無效,唯一的方案則是修改密鑰,但是如果我們這么做了,則將使得已授予的訪問令牌都將無效,所以更改密鑰不是最佳方案,我們應該從源頭盡量控制這個問題,而不是等到問題呈現再來想解決之道,刷新令牌閃亮登場。
同時,若通過刷新令牌獲取新的訪問令牌驗證其無效可將受訪者納入黑名單限制其訪問,那么訪問令牌和刷新令牌的生命周期設置成多久合適呢?這取決于系統要求的安全性,一般來講訪問令牌的生命周期不會太長,比如5分鐘,又比如獲取微信的AccessToken的過期時間為2個小時。
接下來我將用兩張表來演示實現刷新令牌的整個過程,可能有更好的方案,歡迎在評論中提出,學習,學習。我們新建一個http://localhost:5000的WebApi用于身份認證,再新建一個http://localhost:5001的客戶端,首先點擊【模擬登錄獲取Toen】獲取訪問令牌和刷新令牌,然后點擊【調用客戶端獲取當前時間】,如下:
那么問題來了。我們怎么知道訪問令牌已經過期了呢?這是其一,其二是為何要發送舊的訪問令牌去獲取新的訪問令牌呢?直接通過刷新令牌去換取不行嗎?有問題是好的,就怕沒有任何思考,我們一一來解答。我們在客戶端添加JWT中間件時,里面有一個事件可以捕捉到訪問令牌已過期(關于客戶端配置JWT中間件第一節已講過,這里不再啰嗦),如下:通過如上事件并捕捉訪問令牌過期異常,這里我們在響應頭添加了一個自定義鍵act,值為expired,因為一個401只能反映未授權,并不能代表訪問令牌已過期。當我們在第一張圖中點擊【調用客戶端獲取當前時間】發出Ajax請求時,如果訪問令牌過期,此時在Ajax請求中的error方法中捕捉到,我們在如上已給出發出Ajax請求的error方法中繼續進行如下補充:到了這里我們已經解決如何捕捉到訪問令牌已過期的問題,接下來我們需要做的則是獲取刷新令牌,直接通過刷新令牌換取新的訪問令牌也并非不可,只不過還是為了安全性考慮,我們加上舊的訪問令牌。接下來我們發出Ajax請求獲取刷新令牌,如下:發出Ajax請求獲取刷新令牌的方法我們傳入了一個函數,這個函數則是上一次調用接口訪問令牌過期的請求,點擊【調用客戶端獲取當前時間】按鈕的Ajax請求error方法中,最終演變成如下這般:接下來則是通過傳入舊的訪問令牌和刷新令牌調用接口換取新的訪問令牌,如下:如上通過傳入舊的訪問令牌驗證并獲取用戶身份,然后驗證刷新令牌是否已經過期,如果未過期則創建新的訪問令牌,同時更新刷新令牌。最終客戶端訪問令牌過期的那一刻,通過刷新令牌獲取新的訪問令牌繼續調用上一請求,如下:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的ASP.NET Core Web Api之JWT刷新Token(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10分钟了解分布式CAP、BASE理论
- 下一篇: WeihanLi.Npoi 导出支持自定