go中jwt本地驗(yàn)證怎么實(shí)現(xiàn)

小億
96
2024-01-11 03:48:56

在Go中實(shí)現(xiàn)JWT(JSON Web Token)本地驗(yàn)證,可以按照以下步驟進(jìn)行:

  1. 首先,你需要安裝并導(dǎo)入github.com/dgrijalva/jwt-go庫(kù)??梢允褂靡韵旅钸M(jìn)行安裝:
go get github.com/dgrijalva/jwt-go
  1. 在代碼中導(dǎo)入所需的包:
import (
    "github.com/dgrijalva/jwt-go"
)
  1. 定義一個(gè)結(jié)構(gòu)體來(lái)表示JWT的Payload(有效載荷):
type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

這里使用了jwt.StandardClaims來(lái)包含JWT的標(biāo)準(zhǔn)字段(如過(guò)期時(shí)間等)。

  1. 創(chuàng)建一個(gè)用于簽名和驗(yàn)證JWT的密鑰。密鑰可以是任意字符串,但應(yīng)保密保存。在示例中,我們將密鑰定義為變量secretKey
var secretKey = []byte("your-secret-key")
  1. 創(chuàng)建一個(gè)函數(shù)來(lái)生成JWT。以下是一個(gè)生成JWT的示例函數(shù):
func GenerateJWT(username string) (string, error) {
    claims := &Claims{
        Username: username,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 設(shè)置過(guò)期時(shí)間為24小時(shí)
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString(secretKey)
    if err != nil {
        return "", err
    }

    return signedToken, nil
}

在這個(gè)示例中,我們使用jwt.NewWithClaims創(chuàng)建了一個(gè)JWT,并使用SigningMethodHS256指定了簽名算法。然后,我們使用token.SignedString方法對(duì)JWT進(jìn)行簽名,并返回簽名后的JWT字符串。

  1. 創(chuàng)建一個(gè)函數(shù)來(lái)驗(yàn)證JWT。以下是一個(gè)驗(yàn)證JWT的示例函數(shù):
func ValidateJWT(tokenString string) (*Claims, error) {
    claims := &Claims{}

    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
        return secretKey, nil
    })
    if err != nil {
        return nil, err
    }

    if !token.Valid {
        return nil, errors.New("invalid token")
    }

    return claims, nil
}

在這個(gè)示例中,我們使用jwt.ParseWithClaims方法解析JWT,并將解析后的Claims存儲(chǔ)在claims變量中。然后,我們使用相同的密鑰驗(yàn)證JWT的簽名是否有效。如果驗(yàn)證通過(guò),我們返回解析后的Claims。否則,返回一個(gè)錯(cuò)誤。

  1. 現(xiàn)在,你可以使用以上定義的函數(shù)來(lái)生成和驗(yàn)證JWT了。以下是一個(gè)完整的示例:
package main

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

type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

var secretKey = []byte("your-secret-key")

func main() {
    username := "john.doe"
    token, err := GenerateJWT(username)
    if err != nil {
        fmt.Println("Error generating JWT:", err)
        return
    }

    fmt.Println("JWT:", token)

    claims, err := ValidateJWT(token)
    if err != nil {
        fmt.Println("Error validating JWT:", err)
        return
    }

    fmt.Println("Valid token for user:", claims.Username)
}

func GenerateJWT(username string) (string, error) {
    claims := &Claims{
        Username: username,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString(secretKey)
    if err != nil {
        return "", err
    }

    return signedToken, nil
}

func ValidateJWT(tokenString string) (*Claims, error) {
    claims := &Claims{}

    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
        return secretKey, nil
    })
    if err != nil {
        return nil, err
    }

    if !token.Valid {
        return nil, errors.New("invalid token")
    }

    return claims, nil
}

在這個(gè)示例中,我們

0