Go基础(⑧JSON Web Token)
1. 生成 JWT
创建简单的 JWT 生成函数
// 简单生成 JWT
func SimpleGenerateToken(userID int, username string) (string, error) {// 1. 创建声明claims := jwt.MapClaims{"user_id": userID,"username": username,"role": "user","exp": time.Now().Add(24 * time.Hour).Unix(), // 24小时后过期}// 2. 创建 Tokentoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 3. 签名并返回return token.SignedString([]byte("my-secret-key"))
}
2. 解析 JWT
创建简单的 JWT 解析函数
// 简单解析 JWT
func SimpleParseToken(tokenString string) (map[string]interface{}, error) {// 1. 解析 Tokentoken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {// 2. 验证签名算法if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}// 3. 返回签名密钥return []byte("my-secret-key"), nil})if err != nil {return nil, err}// 4. 验证 Token 有效性if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims, nil}return nil, fmt.Errorf("invalid token")
}
3. 完整例子
生成和解析 JWT
package mainimport ("fmt""log""time""github.com/golang-jwt/jwt/v5"
)// 简单生成 JWT
func SimpleGenerateToken(userID int, username string) (string, error) {// 1. 创建声明claims := jwt.MapClaims{"user_id": userID,"username": username,"role": "user","exp": time.Now().Add(24 * time.Hour).Unix(), // 24小时后过期}// 2. 创建 Tokentoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 3. 签名并返回return token.SignedString([]byte("my-secret-key"))
}// 简单解析 JWT
func SimpleParseToken(tokenString string) (map[string]interface{}, error) {// 1. 解析 Tokentoken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {// 2. 验证签名算法if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}// 3. 返回签名密钥return []byte("my-secret-key"), nil})if err != nil {return nil, err}// 4. 验证 Token 有效性if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {return claims, nil}return nil, fmt.Errorf("invalid token")
}func main() {// 1. 生成 JWTfmt.Println("=== 生成 JWT ===")token, err := SimpleGenerateToken(1, "testuser")if err != nil {log.Fatal("生成失败:", err)}fmt.Printf("生成的 Token: %s\n\n", token)// 2. 解析 JWTfmt.Println("=== 解析 JWT ===")claims, err := SimpleParseToken(token)if err != nil {log.Fatal("解析失败:", err)}// 3. 显示解析结果fmt.Printf("用户ID: %v\n", claims["user_id"])fmt.Printf("用户名: %v\n", claims["username"])fmt.Printf("角色: %v\n", claims["role"])fmt.Printf("过期时间: %v\n", claims["exp"])
}
4. 运行结果
输出示例
=== 生成 JWT ===
生成的 Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDY0NDgwMDAsInJvbGUiOiJ1c2VyIiwidXNlcl9pZCI6MSwidXNlcm5hbWUiOiJ0ZXN0dXNlciJ9.signature=== 解析 JWT ===
用户ID: 1
用户名: testuser
角色: user
过期时间: 1706448000
123