sync
This commit is contained in:
92
cmd/decode-token/main.go
Normal file
92
cmd/decode-token/main.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Usage: decode-token <jwt-token>")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
token := os.Args[1]
|
||||
parts := strings.Split(token, ".")
|
||||
|
||||
if len(parts) != 3 {
|
||||
fmt.Println("Invalid JWT token format")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Decode header
|
||||
fmt.Println("=== JWT HEADER ===")
|
||||
headerBytes, err := base64.RawStdEncoding.DecodeString(parts[0])
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to decode header: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
var header map[string]interface{}
|
||||
if err := json.Unmarshal(headerBytes, &header); err != nil {
|
||||
fmt.Printf("Failed to parse header: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
headerJSON, _ := json.MarshalIndent(header, "", " ")
|
||||
fmt.Println(string(headerJSON))
|
||||
|
||||
// Decode payload
|
||||
fmt.Println("\n=== JWT PAYLOAD (CLAIMS) ===")
|
||||
payloadBytes, err := base64.RawStdEncoding.DecodeString(parts[1])
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to decode payload: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
var payload map[string]interface{}
|
||||
if err := json.Unmarshal(payloadBytes, &payload); err != nil {
|
||||
fmt.Printf("Failed to parse payload: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
payloadJSON, _ := json.MarshalIndent(payload, "", " ")
|
||||
fmt.Println(string(payloadJSON))
|
||||
|
||||
fmt.Println("\n=== KEY FIELDS ===")
|
||||
if sub, ok := payload["sub"].(string); ok {
|
||||
fmt.Printf("User ID (sub): %s\n", sub)
|
||||
}
|
||||
if typ, ok := payload["typ"].(string); ok {
|
||||
fmt.Printf("Token Type (typ): %s\n", typ)
|
||||
}
|
||||
if aud, ok := payload["aud"].(string); ok {
|
||||
fmt.Printf("Audience (aud): %s\n", aud)
|
||||
}
|
||||
if exp, ok := payload["exp"].(float64); ok {
|
||||
fmt.Printf("Expires (exp): %v\n", exp)
|
||||
}
|
||||
if iat, ok := payload["iat"].(float64); ok {
|
||||
fmt.Printf("Issued At (iat): %v\n", iat)
|
||||
}
|
||||
|
||||
// Check for user profile fields
|
||||
fmt.Println("\n=== USER PROFILE FIELDS ===")
|
||||
hasProfile := false
|
||||
for key, value := range payload {
|
||||
if strings.Contains(strings.ToLower(key), "name") ||
|
||||
strings.Contains(strings.ToLower(key), "user") ||
|
||||
strings.Contains(strings.ToLower(key), "display") ||
|
||||
strings.Contains(strings.ToLower(key), "email") {
|
||||
fmt.Printf("%s: %v\n", key, value)
|
||||
hasProfile = true
|
||||
}
|
||||
}
|
||||
if !hasProfile {
|
||||
fmt.Println("(No user profile fields found in token)")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user