allow claims and headers to be specified at command line

This commit is contained in:
Dave Grijalva 2017-01-31 11:36:56 -08:00
parent a601269ab7
commit 53194fccb3
2 changed files with 46 additions and 1 deletions

View File

@ -25,14 +25,20 @@ var (
flagKey = flag.String("key", "", "path to key file or '-' to read from stdin") flagKey = flag.String("key", "", "path to key file or '-' to read from stdin")
flagCompact = flag.Bool("compact", false, "output compact JSON") flagCompact = flag.Bool("compact", false, "output compact JSON")
flagDebug = flag.Bool("debug", false, "print out all kinds of debug data") flagDebug = flag.Bool("debug", false, "print out all kinds of debug data")
flagClaims = make(ArgList)
flagHead = make(ArgList)
// Modes - exactly one of these is required // Modes - exactly one of these is required
flagSign = flag.String("sign", "", "path to claims object to sign or '-' to read from stdin") flagSign = flag.String("sign", "", "path to claims object to sign, '-' to read from stdin, or '+' to use only -claim args")
flagVerify = flag.String("verify", "", "path to JWT token to verify or '-' to read from stdin") flagVerify = flag.String("verify", "", "path to JWT token to verify or '-' to read from stdin")
flagShow = flag.String("show", "", "path to JWT file or '-' to read from stdin") flagShow = flag.String("show", "", "path to JWT file or '-' to read from stdin")
) )
func main() { func main() {
// Plug in Var flags
flag.Var(flagClaims, "claim", "add additional claims. may be used more than once")
flag.Var(flagHead, "head", "add additional header params. may be used more than once")
// Usage message if you ask for -help or if you mess up inputs. // Usage message if you ask for -help or if you mess up inputs.
flag.Usage = func() { flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
@ -74,6 +80,8 @@ func loadData(p string) ([]byte, error) {
var rdr io.Reader var rdr io.Reader
if p == "-" { if p == "-" {
rdr = os.Stdin rdr = os.Stdin
} else if p == "+" {
return []byte("{}"), nil
} else { } else {
if f, err := os.Open(p); err == nil { if f, err := os.Open(p); err == nil {
rdr = f rdr = f
@ -171,6 +179,13 @@ func signToken() error {
return fmt.Errorf("Couldn't parse claims JSON: %v", err) return fmt.Errorf("Couldn't parse claims JSON: %v", err)
} }
// add command line claims
if len(flagClaims) > 0 {
for k, v := range flagClaims {
claims[k] = v
}
}
// get the key // get the key
var key interface{} var key interface{}
key, err = loadData(*flagKey) key, err = loadData(*flagKey)
@ -187,6 +202,13 @@ func signToken() error {
// create a new token // create a new token
token := jwt.NewWithClaims(alg, claims) token := jwt.NewWithClaims(alg, claims)
// add command line headers
if len(flagHead) > 0 {
for k, v := range flagHead {
token.Header[k] = v
}
}
if isEs() { if isEs() {
if k, ok := key.([]byte); !ok { if k, ok := key.([]byte); !ok {
return fmt.Errorf("Couldn't convert key data to key") return fmt.Errorf("Couldn't convert key data to key")

23
cmd/jwt/args.go Normal file
View File

@ -0,0 +1,23 @@
package main
import (
"encoding/json"
"fmt"
"strings"
)
type ArgList map[string]string
func (l ArgList) String() string {
data, _ := json.Marshal(l)
return string(data)
}
func (l ArgList) Set(arg string) error {
parts := strings.SplitN(arg, "=", 2)
if len(parts) != 2 {
return fmt.Errorf("Invalid argument '%v'. Must use format 'key=value'. %v", arg, parts)
}
l[parts[0]] = parts[1]
return nil
}