在Go中实现JWT(JSON Web Token)本地验证,可以按照以下步骤进行:
go get github.com/dgrijalva/jwt-go
import (
    "github.com/dgrijalva/jwt-go"
)
type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}
这里使用了jwt.StandardClaims来包含JWT的标准字段(如过期时间等)。
secretKey:var secretKey = []byte("your-secret-key")
func GenerateJWT(username string) (string, error) {
    claims := &Claims{
        Username: username,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 设置过期时间为24小时
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString(secretKey)
    if err != nil {
        return "", err
    }
    return signedToken, nil
}
在这个示例中,我们使用jwt.NewWithClaims创建了一个JWT,并使用SigningMethodHS256指定了签名算法。然后,我们使用token.SignedString方法对JWT进行签名,并返回签名后的JWT字符串。
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
}
在这个示例中,我们使用jwt.ParseWithClaims方法解析JWT,并将解析后的Claims存储在claims变量中。然后,我们使用相同的密钥验证JWT的签名是否有效。如果验证通过,我们返回解析后的Claims。否则,返回一个错误。
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
}
在这个示例中,我们