欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang jwt鑒權的實現(xiàn)流程

 更新時間:2025年02月17日 09:24:14   作者:醒醒a  
本文主要介紹了golang jwt鑒權的實現(xiàn)流程,包含生成JWT令牌、客戶端存儲和發(fā)送JWT令牌、服務端驗證JWT令牌等,具有一定的參考價值,感興趣的可以了解一下

JWT(JSON Web Token)是一種用于在網絡應用環(huán)境間傳遞聲明(Claims)的無狀態(tài)、獨立、緊湊和獨立的信息格式。以下是 JWT 進行鑒權的基本流程:

1. 用戶登錄

用戶通過用戶名和密碼登錄系統(tǒng),系統(tǒng)驗證用戶身份。

2. 生成 JWT 令牌

系統(tǒng)驗證用戶身份成功后,生成一個 JWT 令牌。JWT 令牌通常包含以下部分:

  • Header(頭部):包含令牌的類型(通常是 JWT)和使用的簽名算法(如 HMAC-SHA256)。

  • Payload(載荷):包含聲明(Claims),這些聲明可以是用戶 ID、角色、過期時間等。

  • Signature(簽名):用于驗證 JWT 的完整性和真實性。

3. 返回 JWT 令牌

系統(tǒng)將生成的 JWT 令牌返回給客戶端(通常是瀏覽器或移動應用)。

4. 客戶端存儲 JWT 令牌

客戶端收到 JWT 令牌后,通常會將其存儲在本地存儲(如 localStorage 或 sessionStorage)或 Cookie 中。

5. 客戶端發(fā)送請求

客戶端在后續(xù)的請求中,將 JWT 令牌放在 HTTP 請求頭的 Authorization 字段中,格式通常為 Bearer <token>。

6. 服務端驗證 JWT 令牌

服務端接收到請求后,從 Authorization 請求頭中提取 JWT 令牌,并進行驗證:

  • 驗證簽名:使用與生成 JWT 時相同的密鑰驗證 JWT 的簽名是否有效。

  • 驗證過期時間:檢查 JWT 的過期時間是否已過。

  • 驗證其他聲明:根據需要驗證其他聲明,如用戶角色、權限等。

7. 處理請求

如果 JWT 令牌驗證通過,服務端處理請求并返回響應。如果驗證失敗,返回錯誤響應(如 401 Unauthorized)。

示例代碼

生成 JWT 令牌(服務端)

package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt"
)

// 自定義 Claims
type CustomClaims struct {
    UserID   string `json:"user_id"`
    Role     string `json:"role"`
    jwt.StandardClaims
}

func main() {
    // 自定義 Claims
    claims := CustomClaims{
        UserID: "12345",
        Role:   "admin",
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(24 * time.Hour).Unix(),
            Issuer:    "myapp",
        },
    }

    // 密鑰
    jwtSecret := "mysecretkey"

    // 創(chuàng)建 JWT 令牌
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

    // 使用密鑰簽名并生成字符串形式的 JWT 令牌
    tokenString, err := token.SignedString([]byte(jwtSecret))
    if err != nil {
        fmt.Println("生成令牌失敗:", err)
        return
    }

    fmt.Println("生成的 JWT 令牌:", tokenString)
}

驗證 JWT 令牌(服務端)

package main

import (
    "fmt"
    "net/http"
    "strings"
    "github.com/golang-jwt/jwt"
)

// 自定義 Claims
type CustomClaims struct {
    UserID   string `json:"user_id"`
    Role     string `json:"role"`
    jwt.StandardClaims
}

func handler(w http.ResponseWriter, r *http.Request) {
    // 獲取 Authorization 請求頭
    authHeader := r.Header.Get("Authorization")

    // 檢查 Authorization 請求頭是否存在
    if authHeader == "" {
        http.Error(w, "Missing Authorization header", http.StatusUnauthorized)
        return
    }

    // 提取 JWT 令牌
    tokenString := strings.TrimPrefix(authHeader, "Bearer ")

    // 驗證 JWT 令牌
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        // 提供簽名密鑰
        return []byte("mysecretkey"), nil
    })

    if err != nil {
        http.Error(w, "Invalid token", http.StatusUnauthorized)
        return
    }

    if !token.Valid {
        http.Error(w, "Invalid token", http.StatusUnauthorized)
        return
    }

    // 處理請求
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/api/data", handler)
    http.ListenAndServe(":8080", nil)
}

可以將驗證jwt令牌的方法定義為中間件(Middleware),通過Use方法注冊到gin中,應用于所有路由。gin的中間件在請求處理流程中被調用,可以對請求進行預處理、修改請求或響應,甚至可以終止請求的處理。中間件在 Gin 中非常常用,可以用于實現(xiàn)諸如身份驗證、日志記錄、請求限制等功能。

示例代碼:

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/golang-jwt/jwt"
    "strings"
)

// 自定義 Claims
type CustomClaims struct {
    UserID   string `json:"user_id"`
    Role     string `json:"role"`
    jwt.StandardClaims
}

// Auth 返回一個 Gin 中間件函數
func Auth() gin.HandlerFunc {
    return func(c *gin.Context) {
        // 獲取 Authorization 請求頭
        authHeader := c.GetHeader("Authorization")

        // 檢查 Authorization 請求頭是否存在
        if authHeader == "" {
            c.JSON(401, gin.H{"error": "Missing Authorization header"})
            c.Abort()
            return
        }

        // 提取 JWT 令牌
        tokenString := strings.TrimPrefix(authHeader, "Bearer ")

        // 驗證 JWT 令牌
        token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
            // 提供簽名密鑰
            return []byte("mysecretkey"), nil
        })

        if err != nil {
            c.JSON(401, gin.H{"error": "Invalid token"})
            c.Abort()
            return
        }

        if !token.Valid {
            c.JSON(401, gin.H{"error": "Invalid token"})
            c.Abort()
            return
        }

        // 如果驗證通過,繼續(xù)處理請求
        c.Next()
    }
}

func main() {
    r := gin.Default()

    // 使用 Auth 中間件
    r.Use(Auth())

    r.GET("/api/data", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "Hello, World!"})
    })

    r.Run(":8080")
}

到此這篇關于golang jwt鑒權的實現(xiàn)流程的文章就介紹到這了,更多相關golang jwt鑒權內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Go語言中的流程控制結構和函數詳解

    Go語言中的流程控制結構和函數詳解

    這篇文章主要介紹了Go語言中的流程控制結構和函數詳解,本文詳細講解了if、goto、for、switch等控制語句,同時對函數相關知識做了講解,需要的朋友可以參考下
    2014-10-10
  • 簡單聊聊Golang中Flag包的具體使用

    簡單聊聊Golang中Flag包的具體使用

    flag 包是 Go 語言標準庫中的一個包,用于解析命令行參數,這篇文章主要來和大家簡單聊聊Golang中Flag包的具體使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • golang使用http client發(fā)起get和post請求示例

    golang使用http client發(fā)起get和post請求示例

    這篇文章主要介紹了golang使用http client發(fā)起get和post請求示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • go語言單例模式(Singleton)實例分析

    go語言單例模式(Singleton)實例分析

    這篇文章主要介紹了go語言單例模式(Singleton),實例分析了單例模式的原理與Go語言的實現(xiàn)技巧,需要的朋友可以參考下
    2015-03-03
  • Golang詳細講解常用Http庫及Gin框架的應用

    Golang詳細講解常用Http庫及Gin框架的應用

    下面這篇文章主要給大家介紹了關于Golang常用的Http庫及Gin框架,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 解決vscode中golang插件依賴安裝失敗問題

    解決vscode中golang插件依賴安裝失敗問題

    這篇文章主要介紹了解決vscode中golang插件依賴安裝失敗問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Go語言操作Excel的實現(xiàn)示例

    Go語言操作Excel的實現(xiàn)示例

    excelize是一個功能豐富且易于使用的Go語言庫,它極大地簡化了Excel文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 如何使用Goland IDE go mod 方式構建項目

    如何使用Goland IDE go mod 方式構建項目

    這篇文章主要介紹了如何使用Goland IDE go mod 方式構建項目,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等)

    Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等)

    這篇文章主要介紹了Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等),本文匯總了Go語言的入門知識,需要的朋友可以參考下
    2014-10-10
  • Go設計模式之單例模式圖文詳解

    Go設計模式之單例模式圖文詳解

    單例模式是一種創(chuàng)建型設計模式,讓你能夠保證一個類只有一個實例,并提供一個訪問該實例的全局節(jié)點,本文就通過圖文給大家介紹一下Go的單例模式,需要的朋友可以參考下
    2023-07-07

最新評論