This is an explanation of the video content.
 用技术延续对ACG的热爱
39
 | 
Go使用golang-jwt/jwt

1. 安装

go get -u github.com/golang-jwt/jwt/v4

2. 引入到项目

import "github.com/golang-jwt/jwt/v4"

3. 生成JWT

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
}

4. 解析JWT

函数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
}

5. 使用

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)
}


39 服务端 ↦ Go开发技巧 __ 182 字
 Go开发技巧 #17