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  }