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
參考
沒有留言:
張貼留言