github.com/xmidt-org/webpa-common@v1.11.9/secure/tools/cmd/keyserver/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"github.com/gorilla/mux"
     7  	"github.com/gorilla/schema"
     8  	"log"
     9  	"net/http"
    10  	"os"
    11  )
    12  
    13  type RouteBuilder struct {
    14  	Issuer      string
    15  	InfoLogger  *log.Logger
    16  	ErrorLogger *log.Logger
    17  	KeyStore    *KeyStore
    18  }
    19  
    20  func (rb RouteBuilder) Build(router *mux.Router) {
    21  	keyHandler := KeyHandler{
    22  		BasicHandler{
    23  			keyStore:    rb.KeyStore,
    24  			infoLogger:  rb.InfoLogger,
    25  			errorLogger: rb.ErrorLogger,
    26  		},
    27  	}
    28  
    29  	keysRouter := router.Methods("GET").Subrouter()
    30  
    31  	keysRouter.HandleFunc("/keys", keyHandler.ListKeys)
    32  	rb.InfoLogger.Println("GET /keys returns a list of the identifiers of available keys")
    33  
    34  	keysRouter.HandleFunc(fmt.Sprintf("/keys/{%s}", KeyIDVariableName), keyHandler.GetKey)
    35  	rb.InfoLogger.Println("GET /keys/{kid} returns the public key associated with the given key identifier.  There is no way to look up the associated private key.")
    36  
    37  	issueHandler := IssueHandler{
    38  		BasicHandler: BasicHandler{
    39  			keyStore:    rb.KeyStore,
    40  			infoLogger:  rb.InfoLogger,
    41  			errorLogger: rb.ErrorLogger,
    42  		},
    43  		decoder: schema.NewDecoder(),
    44  		issuer:  rb.Issuer,
    45  	}
    46  
    47  	issueRouter := router.
    48  		Path("/jws").
    49  		Queries(KeyIDVariableName, "").
    50  		Subrouter()
    51  
    52  	issueRouter.Methods("GET").
    53  		HandlerFunc(issueHandler.SimpleIssue)
    54  	rb.InfoLogger.Println("GET /jws?kid={kid} generates a JWT signed with the associated private key.  Additional URL parameters are interpreted as reserved claims, e.g. exp")
    55  
    56  	issueRouter.Methods("PUT", "POST").
    57  		Headers("Content-Type", "application/json").
    58  		HandlerFunc(issueHandler.IssueUsingBody)
    59  	rb.InfoLogger.Println("PUT/POST /jws generates a JWT signed with the associated private key.  Additional URL parmaeters are interpreted as reserved claims, e.g. exp")
    60  }
    61  
    62  func main() {
    63  	infoLogger := log.New(os.Stdout, "[INFO]  ", log.LstdFlags|log.LUTC)
    64  	errorLogger := log.New(os.Stderr, "[ERROR] ", log.LstdFlags|log.LUTC)
    65  
    66  	var configurationFileName string
    67  	flag.StringVar(&configurationFileName, "f", "", "the required configuration file")
    68  	flag.Parse()
    69  
    70  	configuration, err := ParseConfiguration(configurationFileName)
    71  	if err != nil {
    72  		errorLogger.Fatalf("Unable to parse configuration file: %s\n", err)
    73  	}
    74  
    75  	keyStore, err := NewKeyStore(infoLogger, configuration)
    76  	if err != nil {
    77  		errorLogger.Fatalf("Unable to initialize key store: %s\n", err)
    78  	}
    79  
    80  	infoLogger.Printf("Initialized key store with %d keys: %s\n", keyStore.Len(), keyStore.KeyIDs())
    81  
    82  	issuer := configuration.Issuer
    83  	if len(issuer) == 0 {
    84  		issuer = DefaultIssuer
    85  	}
    86  
    87  	router := mux.NewRouter()
    88  	RouteBuilder{
    89  		Issuer:      issuer,
    90  		ErrorLogger: errorLogger,
    91  		InfoLogger:  infoLogger,
    92  		KeyStore:    keyStore,
    93  	}.Build(router)
    94  
    95  	bindAddress := configuration.BindAddress
    96  	if len(bindAddress) == 0 {
    97  		bindAddress = DefaultBindAddress
    98  	}
    99  
   100  	server := &http.Server{
   101  		Addr:     bindAddress,
   102  		Handler:  router,
   103  		ErrorLog: errorLogger,
   104  	}
   105  
   106  	infoLogger.Printf("Listening on %s\n", bindAddress)
   107  	log.Fatalln(server.ListenAndServe())
   108  }