亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Web開發(fā)的身份證:JWT(json web token)令牌使用方法

admin
2025年9月2日 22:43 本文熱度 342

先拋個問題,我們在京東購物時,整個購物過程,只登錄了一次,切換頁面后,為什么沒有再次讓你輸入賬號密碼登錄?

答案就是今天的主角:jwt,那他又是如何實現(xiàn)登錄態(tài)的保持呢?

JWT令牌是什么?

JWT(JSON Web Token)是一種用于用戶身份驗證的機(jī)制,它保證了客戶端與服務(wù)端信息的安全傳輸,這種傳輸并不是加密的傳輸,而是驗證真?zhèn)蔚膫鬏敗?/span>
當(dāng)用戶通過用戶名和密碼登錄系統(tǒng)后,云端就會為此用戶進(jìn)行授權(quán),為其頒發(fā)一個『身份證』:jwt,之后客戶端訪問云端資源,需要攜帶這個【身份】才能通過云端的驗證,就像我們在國內(nèi)帶著身份證才能買機(jī)票、住酒店,拿著護(hù)照才能走遍天下,身份證、護(hù)照的驗證機(jī)制就是現(xiàn)實版的JWT。

JWT的結(jié)構(gòu)

我們有如下一個jwt令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IuajieiKseezliIsImlzQWRtaW4iOnRydWUsImlzcyI6IueggeWGnOWknOivuyIsInN1YiI6IuajieiKseezli1KV1Tku4vnu40iLCJhdWQiOlsicHJvZ3JhbW1lciJdLCJleHAiOjE3NTU2MTc0MzUsImlhdCI6MTc1NTUzMTAzNX0.N6uvzyo-MZqtu4A1jNt9qXcBLILVFpRt29cLNJXqNWM
JWT一共包含三個部分,以【.】作為分割:

  1. Header頭部:包含令牌的類型和所使用的加密算法。
  2. Payload負(fù)載:實際存放的數(shù)據(jù),可以自定義,主要有以下字段。
  3. Signature簽名,用于驗證發(fā)送者和內(nèi)容是否被篡改。簽名由header、payload、密鑰和指定的算法生成。

對于上文中的jwt,解碼后:

JWT的工作流程

下面,以一張圖來展示jwt的工作流程,這樣更清晰且容易理解:
上圖主要說明2個過程:

  • 第一個為登錄,生成jwt令牌。
  • 第二個為訪問云端資源時,在header中攜帶jwt令牌,云端對jwt進(jìn)行驗證后,返回對應(yīng)資源。
?

    生成jwt令牌的代碼實現(xiàn)(golang)

    對于jwt的操作,主要使用golang的如下包:
    github.com/golang-jwt/jwt/v5
    第一步定義生成jwt的密鑰:
    var jwtKey = []byte("your_secret_key")
    第二步,定義claims結(jié)構(gòu):
    // 定義 Claims 結(jié)構(gòu)體,可以添加自定義字段type Claims struct {    Username             string `json:"username"` // 自定義字段,例如用戶名    IsAdmin              bool   `json:"isAdmin"`  // 自定義字段,例如是否是管理員    jwt.RegisteredClaims        // jwt 標(biāo)準(zhǔn)字段}
    第三步,生成jwt:
    func main() {    // 創(chuàng)建一個新的 token    token := jwt.NewWithClaims(jwt.SigningMethodHS256, Claims{        Username"棉花糖",        IsAdmin:  true,        RegisteredClaims: jwt.RegisteredClaims{            Issuer:    "碼農(nóng)夜讀",            Subject:   "棉花糖-JWT介紹",            Audience:  []string{"programmer"},            ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),            IssuedAt:  jwt.NewNumericDate(time.Now()),        },    })    // 使用密鑰簽名 token    tokenString, err := token.SignedString(jwtKey)    if err != nil {        panic(err)    }    println("Generated Token:", tokenString)}

    JWT合法性驗證(golang)

    jwt的合法性校驗,如同校驗身份證號是否準(zhǔn)確一樣,如果jwt驗證通過,則可以進(jìn)行下一步的資源獲取,否則將會終止請求,golang-jwt包提供了對jwt進(jìn)行合法性校驗的api,同時當(dāng)校驗不通過時,也會給出明確的錯誤:
    func ValidateToken(tokenString string) (*Claims, error) {    claims := &Claims{}    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {        return jwtKey, nil    })    if err != nil {        if errors.Is(err, jwt.ErrInvalidKey) {            return nil, fmt.Errorf("jwt invalid")        } else if errors.Is(err, jwt.ErrTokenMalformed) {            return nil, fmt.Errorf("malformed token")        } else if errors.Is(err, jwt.ErrTokenExpired) {            return nil, fmt.Errorf("token has expired")        }        return nil, fmt.Errorf("couldn't parse token: %v", err)    }    if !token.Valid {        return nil, fmt.Errorf("token is invalid")    }    return claims, nil}
    我們可以通過claims字段獲取到生成jwt的具體內(nèi)容:
    如果你需要校驗用戶id是否合法,那么就可以在生成jwt時,將用戶id放入claims字段中,在解析時就可以拿到。
    通常,jwt的有效性校驗都是放在服務(wù)中間件中,所有請求都會對jwt進(jìn)行驗證,以此來保證數(shù)據(jù)傳輸?shù)陌踩?/span>
    好啦,以上就是jwt的所有知識點了。


    閱讀原文:原文鏈接


    該文章在 2025/9/3 10:19:08 編輯過
    關(guān)鍵字查詢
    相關(guān)文章
    正在查詢...
    點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
    點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
    點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
    點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
    Copyright 2010-2025 ClickSun All Rights Reserved