go get -u github.com/golang-jwt/jwt/v4
import "github.com/golang-jwt/jwt/v4"
GenerateJWT接收用户名、角色和密钥作为参数,并生成一个包含这些声明的JWT令牌。过期时间设置为当前时间加上24小时。如果生成过程中发生错误,函数将返回一个错误。否则,将返回生成的JWT令牌。
func GenerateJWT(username string, role string, secretKey string) (string, error) {
claims := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": username,
"role": role,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
token, err := claims.SignedString([]byte(secretKey))
if err != nil {
return "", err
}
return token, nil
}
函数ParseJWT接收JWT令牌字符串和密钥作为参数,并验证和解析JWT令牌。如果验证成功且JWT有效,函数将返回声明(claims)。否则,将返回相应的错误。
这两个函数分别用于生成和封装JWT令牌,以及验证和解析JWT令牌。您可以根据需要调用这些函数,并传入相应的参数。请确保引入github.com/golang-jwt/jwt/v4库,并根据您的具体需求进行适当的错误处理。
func ParseJWT(tokenString string, secretKey string) (jwt.MapClaims, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
}
return nil, jwt.ErrInvalidKey
}
func main() {
// 生成JWT令牌
secretKey := "my-secret-key"
token, err := GenerateJWT("john.doe", "admin", secretKey)
if err != nil {
fmt.Println("Failed to generate JWT:", err)
return
}
fmt.Println("Generated JWT:", token)
// 验证和解析JWT令牌
claims, err := ParseJWT(token, secretKey)
if err != nil {
fmt.Println("Failed to parse JWT:", err)
return
}
// 提取声明中的信息
username := claims["username"].(string)
role := claims["role"].(string)
fmt.Println("Username:", username)
fmt.Println("Role:", role)
}