Skip to content
鼓励作者:欢迎打赏犒劳

jwt解析

无任何依赖解析消息体

注意,只解析消息体而已。其实就是base64解析

go
package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"log"
	"strings"
)

func DecodeJWTPayloadNoDep(tokenString string) (map[string]interface{}, error) {
	parts := strings.Split(tokenString, ".")
	if len(parts) != 3 {
		return nil, fmt.Errorf("无效的JWT")
	}

	payload := parts[1]

	// 处理Base64URL的填充
	switch len(payload) % 4 {
	case 2:
		payload += "=="
	case 3:
		payload += "="
	}

	// 使用标准库解码
	decoded, err := base64.URLEncoding.DecodeString(payload)
	if err != nil {
		return nil, fmt.Errorf("解码失败: %w", err)
	}

	var claims map[string]interface{}
	if err := json.Unmarshal(decoded, &claims); err != nil {
		return nil, fmt.Errorf("解析JSON失败: %w", err)
	}

	return claims, nil
}

// ==================== 使用示例 ====================

func main() {
	// 示例JWT
	token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

	params, err := DecodeJWTPayloadNoDep(token)
	if err != nil {
		log.Fatalf("解码失败: %v", err)
	}

	// 直接打印所有参数
	fmt.Println("JWT 中的参数:")
	for key, value := range params {
		fmt.Printf("  %s = %v\n", key, value)
	}
}

结果

text
JWT 中的参数:
  name = John Doe
  admin = true
  iat = 1.516239022e+09
  sub = 1234567890

如有转载或 CV 的请标注本站原文地址