2026年5月4日 星期一

JWT 概念實作

JWT 應該是多數站台處理API 身份驗證與授權的應用,這邊使用ASP.Net WebApi 將概念實作,

其中,透過AI 支援讓產出加快並且紀錄一下...



JWT(JSON Web Token ) 較完整的介紹可以參考這篇,而 jwt 結構中的三個部分為

header.payload.signature ,而這三個部分都是透過 base64 編碼,因為是編碼,所以使用者皆

可以取得內容後解碼,故不適合將機密資料放入,例如:帳號、密碼、銀行帳密等等


透過 https://www.jwt.io/ 網站可以觀察各部分代表的值及其變化,這部分是依據「.」來區分



JWT 的 Header 就是放入演算法跟 type,通常也不會太大變化,Signature 就是放入簽章,簽章的長度

就搭配演算法來決定,通常會有客製化的部分就是 Payload,payload 除了 sub 和 iat 之外,還會放其

他東西,以下列一下基本項目,也都可以加入你想放入的參數


iss(issuer):此 JWT 的發行人

sub(subject):JWT 的使用者(通常是放使用者的 id 的值)

aud(audience):接收此 JWT 的收件人

exp(expiration time):此 JWT 過期失效的時間

iat(issued at time):此 JWT 是什麼時候被發布的(即是什麼時候被創建)

nbf(not before time):定義在某個時間以前,此 JWT 都是不可用的

jti(JWT ID):此 JWT 的唯一身份標誌,也許可以設定 guid 值




以上就是基本的 JWT 介紹,以下是專案實作架構




專案加入 Microsoft 的 JwtBearer 套件,並且加入 IdentityModel 套件


appsetting.json 加入基本設定值

其中,token 有效時間為 60 分鐘,刷新 token 的有效時間為 3 天


Program.cs 檔案


其中,JwtBearerEvents Middlewave 可以檢核 使用者是否已經登出,若登出會回覆401 給呼叫端

TokenService.cs 檔案

其中,正常登入後會產生一組 AccessToken 並且透過 JwtSecurityTokenHandler 寫入


AuthController.cs 檔案




ProtectedController.cs 檔案

這檔案用來模擬使用者存取webapi 的資源

整個請求的流程圖



其中TokenBlacklistService.cs 與 RefreshTokenService.cs 都有使用 ConcurrentDictionary 來記錄資料,

實務上可能要換成 Redis 較適合,這樣分散式系統就能保持一至性


程式碼:https://github.com/goodmanbuild/DemoJWT


參考

沒有留言:

張貼留言