
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
