跟我一起學.NetCore之WebApi介面裸奔有風險(Jwt)

Code綜藝圈發表於2020-10-10

前言

擼碼需謹慎,裸奔有風險。經常在一些技術交流群中瞭解到,還有很多小夥伴的專案中Api介面沒有做任何安全機制驗證,直接就裸奔了,對於一些臨時專案或是個人小專案還好,其餘的話,建議小夥伴們酌情考慮都加上,畢竟介面安全這事可大可小。

通常會採用session、cookie、jwt、ids4等方式進行介面安全認證或授權,這裡就先拿jwt說事,ids4知識點比較多,後續單獨整理整理;對於session和cookie的方式就留給小夥伴們研究吧,因為最近接觸或是和朋友聊到的專案中,使用的不多,所以就不單獨拿出來細說了。

正文

JSON Web Token (JWT)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用於作為JSON物件在各方之間安全地傳輸資訊。該資訊可以被驗證和信任,因為它是數字簽名的。---官網翻譯

主要用於系統中授權認證,使得在資料交換過程中通過Token方式進行校驗,相對比較安全;而Token包含三部分,每部分用點(.)進行拼接,內容結構為:Header.Payload.Signature

  • Header(頭)

    一個Json物件,通過Base64URL演算法將其轉換為一個字串。裡面有兩個屬性,alg和typ分別代表簽名演算法和生成token的型別。

  • Payload(負載)

    一個Json物件,通過Base64URL演算法將其轉換為一個字串。裡面預設有一些官方定義的資訊,也可以將自定義資訊加入到其中,但是由於不是加密的,強烈不介意將敏感資訊放在其中。預設屬性大概如下:

iss (issuer):簽發人

exp (expiration time):過期時間

sub (subject):主題

aud (audience):接受方

nbf (Not Before):生效時間

iat (Issued At):簽發時間

jti (JWT ID):唯一編號

  • Signature(簽名)

    這個是對前兩部分的內容進行簽名,需要一個祕鑰,再通過Header中指定的簽名演算法生成簽名。比如指定演算法為HMACSHA256時,生成的簽名為:

    img

收,理論知識就先提及這麼多,如果需要詳細瞭解的,可以進管網(https://jwt.io/introduction)瞅瞅,英文版怕怕?別啊,翻譯工具那麼多,應該難不倒小夥伴。接下來就通過程式碼演示方式說說jwt使用方式及涉及到的相關知識點吧。

這裡還是在上一篇文章的例子上進行舉例演示(跟我一起學.NetCore之Swagger讓前後端不再煩惱及介面自定義),不是偷懶,而是利用Swagger方便測試,另外就是針對認證對Swagger進行一個小知識點的擴充套件。

img

以上Swagger內容不是必須,如果小夥伴不想用Swagger進行測試,直接使用類似於Postman的工具也是可以的,測試方式不衝突,所以小夥伴們別跑,我們們繼續往下看↓↓↓

使用元件的經典三步走:安裝包->註冊元件->註冊中介軟體;jwt整合使用如下:

img

img

通過以上簡單三步操作,已經將Jwt整合到專案中,接下來開始用它來保護我們的Api介面:

img

如上,通過簡單的在介面上增加[Authorize]特性就能保護起來啦,現在只能帶“身份證”才能玩了,那系統中得有一個頒發"身份證"的地方,供系統識別驗證,一般都會將其放在登入介面的地方,當使用者驗證成功之後,就生成對應的Token給客戶端,客戶端拿著這個Token就可以當“身份證”來呼叫介面啦,看如下程式碼:

img

這個錯誤應該是剛開始經常遇到的,必須要求金鑰是大於等於16個字元,否則就會失敗。修改金鑰長度如下:

img

然後執行,重新登入獲取Token,如下圖:

img

可以看到,上面程式碼中的公共資訊部分應該提取到公共配置資訊中,不然要改幾個地方,所以在程式開發過程中,小夥伴麼儘量不要硬編碼,不然就等於給自己找維護工作。

Token已經生成了,那怎麼用?現在Swagger不支援輸入Token,可以使用postman類似的工具進行介面測試,如下:

img

輸入Token,成功獲取資訊:

img

Token的使用本質其實是在Header中增加了一個Authorization頭,如下圖:

img

Authorization中的值為Bearer+' '+Token,中間一定要有一個空格。同理,前端呼叫API介面的時候也是在請求頭中增加Authorization即可。

拿到Token,就可以訪問受保護的API了,現在應該瞭解一下生成的Token是否和剛開始說的理論一樣,同時可以通過jwt官網進行解析檢視具體內容:

img

通過官網解析看看內容:

img

通過上面得知,沒有經過業務加密的Token,是可以進行解析的,所以不建議把一些敏感資訊放在Payload中。但是對於認證來說是安全,因為校驗簽名是需要金鑰的,而金鑰是存在伺服器端,一般人肯定是不知道的。

對於Token的過期,有一個點,即過期滑動時間,如果不設定,預設是五分鐘,即當設定Token有效期到期時,不會馬上失效,而是再過五分鐘才失效,如下例:

img

過了幾分鐘後還是沒有過期,如下:

img

過六分之後,再訪問,發現Token才失效,如果覺得過期滑動時間不滿足需求,可以進行設定,如下:

img

這裡執行效果就不截圖了,小夥伴試試吧!!! 這裡關於Jwt的整合先說這麼多,肯定是沒有說完的,還有許可權驗證那塊,單獨整理一篇說吧,內容也不少。

Swagger小擴充套件

既然都用到Swagger,肯定是希望在Swagger上直接測試,來來來,繼續往下看看↓↓↓

在註冊Swagger元件時進行相關配置:

img

執行結果如下:

img

點選小鎖,彈出框可進行Token輸入:

img

輸入Token授權之後就可以呼叫保護的介面,可以很方便的進行測試,這裡就不截圖演示了,小夥伴們動手試試吧。

附加知識點:

由於SecurityRequirementsOperationFilter預設將securitySchemaName 設定為"oauth2",所以在Swagger中加入描述的時候需要指定第一個引數為"oauth2",原始碼如下:

img

也可以換成其他方式,參照實現的方式2,兩種方式差不多,如下圖:

img

注意點:

  • 生成Token時的金鑰大於或等於16個字元;

  • 生成的Token中預設不加密,敏感資訊不要放入其中,如果有需要,可以將Token進行加密;

  • Token傳輸如果是外網,建議用Https,防止中途被攔截;

  • Token防止洩露,可以將有效期設定短一點;

總結

關於許可權的驗證單獨再整理一篇分享,這裡就先到這吧;旅遊或回家的小夥伴們應該都回到自己的住處了吧,好好休息休息,又要開始擼碼啦。

一個被程式搞醜的帥小夥,關注"Code綜藝圈",識別關注跟我一起學~~~

擼文不易,莫要白瞟,三連走起~~~~

相關文章