github.com/xmidt-org/webpa-common@v1.11.9/secure/tools/cmd/jwt/main.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "encoding/base64" 6 "encoding/json" 7 "errors" 8 "flag" 9 "fmt" 10 "io/ioutil" 11 "os" 12 ) 13 14 var ( 15 ErrorMalformedToken = errors.New("That token is not valid") 16 ) 17 18 type Arguments struct { 19 Token string 20 KeyURI string 21 } 22 23 func decodeAndUnmarshal(encoding *base64.Encoding, encoded []byte) (map[string]interface{}, error) { 24 decoder := base64.NewDecoder(encoding, bytes.NewReader(encoded)) 25 decoded, err := ioutil.ReadAll(decoder) 26 if err != nil { 27 return nil, err 28 } 29 30 unmarshalled := make(map[string]interface{}) 31 err = json.Unmarshal(decoded, &unmarshalled) 32 return unmarshalled, err 33 } 34 35 func displayToken(token []byte) error { 36 parts := bytes.Split(token, []byte{'.'}) 37 if len(parts) < 2 { 38 return ErrorMalformedToken 39 } 40 41 header, err := decodeAndUnmarshal(base64.StdEncoding, parts[0]) 42 if err != nil { 43 return err 44 } 45 46 fmt.Println(header) 47 48 payload, err := decodeAndUnmarshal(base64.StdEncoding, parts[1]) 49 if err != nil { 50 return err 51 } 52 53 fmt.Println(payload) 54 return nil 55 } 56 57 func main() { 58 var arguments Arguments 59 flag.StringVar(&arguments.Token, "t", "", "The JWT token. If not supplied, a token is expected from stdin.") 60 flag.StringVar(&arguments.KeyURI, "k", "", "the URI of a public key for verification (optional)") 61 flag.Parse() 62 63 var ( 64 token []byte 65 err error 66 ) 67 68 if len(arguments.Token) == 0 { 69 token, err = ioutil.ReadAll(os.Stdin) 70 if err != nil { 71 fmt.Fprintf(os.Stdout, "Unable to read token from stdin: %s\n", err) 72 return 73 } 74 } else { 75 token = []byte(arguments.Token) 76 } 77 78 if err = displayToken(token); err != nil { 79 fmt.Fprintf(os.Stdout, "%s\n", err) 80 } 81 }