在Go中实现JWT(JSON Web Token)本地验证,可以按照以下步骤进行:
首先,你需要安装并导入github.com/dgrijalva/jwt-go库。可以使用以下命令进行安装:go get github.com/dgrijalva/jwt-go在代码中导入所需的包:import ( "github.com/dgrijalva/jwt-go")定义一个结构体来表示JWT的Payload(有效载荷):type Claims struct { Username string `json:"username"` jwt.StandardClaims}这里使用了jwt.StandardClaims来包含JWT的标准字段(如过期时间等)。
secretKey:var secretKey = []byte("your-secret-key")创建一个函数来生成JWT。以下是一个生成JWT的示例函数: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 mainimport ( "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}在这个示例中,我们

