From bfe63216d88676d7bf6bd5a53df0d45bd7f6dca6 Mon Sep 17 00:00:00 2001 From: Thomas Gunsch Date: Sat, 1 May 2021 11:17:48 +0200 Subject: [PATCH 1/3] refactor jwt handling --- internal/jwt/get_test.go | 7 +++++-- internal/jwt/handler.go | 9 ++++---- internal/jwt/types.go | 45 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 internal/jwt/types.go diff --git a/internal/jwt/get_test.go b/internal/jwt/get_test.go index 0551922..0b7202d 100644 --- a/internal/jwt/get_test.go +++ b/internal/jwt/get_test.go @@ -13,7 +13,7 @@ import ( var _ = Describe("GetHandler", func() { It("return a jwt", func() { - ctx, _, responseRecorder := mockGetContext("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c") + ctx, _, responseRecorder := mockGetContext("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") err := jwt.GetHandler(ctx) Expect(err).Should(BeNil()) @@ -23,7 +23,10 @@ var _ = Describe("GetHandler", func() { // response body contains json cookie Expect(responseRecorder.Body.String()).To(MatchJSON(`{ - "iat": 1516239022, + "admin": true, + "exp": 1619349763, + "iat": 1619346163, + "jti": "882f71a3-db3a-4a67-959e-6fd172aaaca0", "name": "John Doe", "sub": "1234567890" }`)) diff --git a/internal/jwt/handler.go b/internal/jwt/handler.go index 5122a22..d7e0f61 100644 --- a/internal/jwt/handler.go +++ b/internal/jwt/handler.go @@ -4,9 +4,7 @@ import ( "encoding/json" "fmt" "github.com/labstack/echo/v4" - "github.com/lestrrat-go/jwx/jwt" "net/http" - "strings" ) // @Summary Get jwt passed as authorization bearer token of the request. @@ -22,16 +20,19 @@ func GetHandler(context echo.Context) error { l := len("Bearer") if auth[:l] == "Bearer" { rawToken := auth[l+1:] - token, err := jwt.ParseReader(strings.NewReader(rawToken)) + + response, err := NewResponse(rawToken) if err != nil { return context.String(http.StatusBadRequest, fmt.Sprintf("failed to parse payload: %s\n", err)) } - prettyJSON, err := json.MarshalIndent(token, "", " ") + + prettyJSON, err := json.MarshalIndent(response, "", " ") if err != nil { return context.String(http.StatusBadRequest, fmt.Sprintf("Error parsing cookies: %v", err.Error())) } return context.String(http.StatusOK, string(prettyJSON)) + } return context.String(http.StatusBadRequest, "No JWT in request header") diff --git a/internal/jwt/types.go b/internal/jwt/types.go new file mode 100644 index 0000000..6158cda --- /dev/null +++ b/internal/jwt/types.go @@ -0,0 +1,45 @@ +package jwt + +import ( + "bytes" + "context" + "fmt" + "github.com/lestrrat-go/jwx/jws" + "github.com/lestrrat-go/jwx/jwt" + "strings" +) + +type Response struct { + //Method SigningMethod // The signing method used or to be used + Header map[string]interface{} `json:"header"` + Payload jwt.Token `json:"payload"` + Signature string `json:"signature"` + Valid bool `json:"valid"` +} + + +func NewResponse(rawToken string) (*Response,error) { + + + msg, err := jws.ParseReader(strings.NewReader(rawToken)) + if err != nil { + return nil, fmt.Errorf("failed to parse token data: %v",err) + } + + token, err := jwt.ParseReader(bytes.NewReader(msg.Payload())) + if err != nil { + return nil,fmt.Errorf("failed to parse payload: %s\n", err) + } + + var header = make(map[string]interface{}) + signatures := msg.Signatures() + for _, signature := range signatures { + header, _ = signature.ProtectedHeaders().AsMap(context.TODO()) + } + + return &Response{ + Payload: token, + Header: header, + },nil + +} \ No newline at end of file From 8a2fea051f0dccdf0c8a7b532dee2ceeeeea8db6 Mon Sep 17 00:00:00 2001 From: Thomas Gunsch Date: Sat, 1 May 2021 18:18:48 +0200 Subject: [PATCH 2/3] add validate --- internal/jwt/get_test.go | 56 ++++++++++++++++++---- internal/jwt/handler.go | 41 ++++++++++++----- internal/jwt/types.go | 97 ++++++++++++++++++++++++++++++--------- internal/util/httputil.go | 10 ++++ 4 files changed, 161 insertions(+), 43 deletions(-) diff --git a/internal/jwt/get_test.go b/internal/jwt/get_test.go index 0b7202d..8caecbc 100644 --- a/internal/jwt/get_test.go +++ b/internal/jwt/get_test.go @@ -11,9 +11,9 @@ import ( ) var _ = Describe("GetHandler", func() { - It("return a jwt", func() { + It("return a not validated jwt", func() { - ctx, _, responseRecorder := mockGetContext("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") + ctx, _, responseRecorder := mockGetContext("http://myapp.com/api/jwt", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") err := jwt.GetHandler(ctx) Expect(err).Should(BeNil()) @@ -23,20 +23,56 @@ var _ = Describe("GetHandler", func() { // response body contains json cookie Expect(responseRecorder.Body.String()).To(MatchJSON(`{ - "admin": true, - "exp": 1619349763, - "iat": 1619346163, - "jti": "882f71a3-db3a-4a67-959e-6fd172aaaca0", - "name": "John Doe", - "sub": "1234567890" + "raw": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4", + "header": { + "alg": "HS256", + "typ": "JWT" + }, + "payload": { + "admin": true, + "exp": "2021-04-25T11:22:43Z", + "iat": "2021-04-25T10:22:43Z", + "jti": "882f71a3-db3a-4a67-959e-6fd172aaaca0", + "name": "John Doe", + "sub": "1234567890" + } + }`)) + }) + It("return a validated jwt", func() { + + ctx, _, responseRecorder := mockGetContext("http://myapp.com/api/jwt?validate=true", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") + + err := jwt.GetHandler(ctx) + Expect(err).Should(BeNil()) + + // return 200 + Expect(responseRecorder.Code).Should(Equal(200)) + + // response body contains json cookie + Expect(responseRecorder.Body.String()).To(MatchJSON(`{ + "raw": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4", + "header": { + "alg": "HS256", + "typ": "JWT" + }, + "payload": { + "admin": true, + "exp": "2021-04-25T11:22:43Z", + "iat": "2021-04-25T10:22:43Z", + "jti": "882f71a3-db3a-4a67-959e-6fd172aaaca0", + "name": "John Doe", + "sub": "1234567890" + }, + "valid": false, + "validateError": "exp not satisfied" }`)) }) }) -func mockGetContext(token string) (echo.Context, *http.Request, *httptest.ResponseRecorder) { +func mockGetContext(uri string, token string) (echo.Context, *http.Request, *httptest.ResponseRecorder) { e := echo.New() - req := httptest.NewRequest(http.MethodGet, "http://myapp.com/api/jwt", nil) + req := httptest.NewRequest(http.MethodGet, uri, nil) req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) req.Header.Set(echo.HeaderAuthorization, fmt.Sprintf("Bearer %s", token)) res := httptest.NewRecorder() diff --git a/internal/jwt/handler.go b/internal/jwt/handler.go index d7e0f61..94646c4 100644 --- a/internal/jwt/handler.go +++ b/internal/jwt/handler.go @@ -1,9 +1,12 @@ package jwt import ( + "context" "encoding/json" "fmt" "github.com/labstack/echo/v4" + "github.com/lestrrat-go/jwx/jwk" + "github.com/tgunsch/httpod/internal/util" "net/http" ) @@ -12,28 +15,42 @@ import ( // @Description Requests using GET should only retrieve data. // @Accept json // @Produce json +// @Param validate query bool false "if true, the jwt is validated" +// @Param jwksUri query string false "if set, the jwt is verified with the key received from jwks endpoint" // @Success 200 {array} jwt.Token // @Router /jwt [get] -func GetHandler(context echo.Context) error { - - auth := context.Request().Header.Get(echo.HeaderAuthorization) +func GetHandler(ctx echo.Context) error { + var ( + auth string + keys jwk.Set + err error + response *Response + prettyJSON []byte + validate bool + ) + + auth = ctx.Request().Header.Get(echo.HeaderAuthorization) l := len("Bearer") if auth[:l] == "Bearer" { rawToken := auth[l+1:] - response, err := NewResponse(rawToken) - if err != nil { - return context.String(http.StatusBadRequest, fmt.Sprintf("failed to parse payload: %s\n", err)) + jwksUri := ctx.QueryParam("jwksUri") + if jwksUri != "" { + if keys, err = jwk.Fetch(context.Background(), jwksUri); err != nil { + return ctx.String(http.StatusBadRequest, fmt.Sprintf("failed to validate token: %s\n", err)) + } + } + validate = util.GetBoolParam(ctx, "validate") + if response, err = NewResponse(rawToken, validate, keys); err != nil { + return ctx.String(http.StatusBadRequest, fmt.Sprintf("failed to parse payload: %s\n", err)) } - - prettyJSON, err := json.MarshalIndent(response, "", " ") - if err != nil { - return context.String(http.StatusBadRequest, fmt.Sprintf("Error parsing cookies: %v", err.Error())) + if prettyJSON, err = json.MarshalIndent(response, "", " "); err != nil { + return ctx.String(http.StatusBadRequest, fmt.Sprintf("Error parsing cookies: %v", err.Error())) } - return context.String(http.StatusOK, string(prettyJSON)) + return ctx.String(http.StatusOK, string(prettyJSON)) } - return context.String(http.StatusBadRequest, "No JWT in request header") + return ctx.String(http.StatusBadRequest, "No JWT in request header") } diff --git a/internal/jwt/types.go b/internal/jwt/types.go index 6158cda..5433d16 100644 --- a/internal/jwt/types.go +++ b/internal/jwt/types.go @@ -4,42 +4,97 @@ import ( "bytes" "context" "fmt" + "github.com/lestrrat-go/jwx/jwk" "github.com/lestrrat-go/jwx/jws" "github.com/lestrrat-go/jwx/jwt" - "strings" ) type Response struct { //Method SigningMethod // The signing method used or to be used - Header map[string]interface{} `json:"header"` - Payload jwt.Token `json:"payload"` - Signature string `json:"signature"` - Valid bool `json:"valid"` + Raw string `json:"raw"` + Header map[string]interface{} `json:"header"` + Payload map[string]interface{} `json:"payload"` + Valid *bool `json:"valid,omitempty"` + ValidateError string `json:"validateError,omitempty"` } +func NewResponse(rawToken string, validate bool, keys jwk.Set) (*Response, error) { + var ( + payload map[string]interface{} + header map[string]interface{} + err error + msg *jws.Message + token jwt.Token + valid *bool + validateError string + ) -func NewResponse(rawToken string) (*Response,error) { + if msg, err = jws.ParseString(rawToken); err != nil { + return nil, fmt.Errorf("failed to parse token data: %v", err) + } + if validate { + if token, err, validateError = parseValidate(keys, msg); err != nil { + return nil, err + } + if validateError != "" { + valid = newOptionalBool(false) + } + } else { + if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload())); err != nil { + // try to parse without validate + return nil, fmt.Errorf("failed to parse payload: %s\n", err) + } + } - msg, err := jws.ParseReader(strings.NewReader(rawToken)) - if err != nil { - return nil, fmt.Errorf("failed to parse token data: %v",err) + if payload, err = token.AsMap(context.TODO()); err != nil { + return nil, err + } + if header, err = getJWTHeader(msg); err != nil { + return nil, err } - token, err := jwt.ParseReader(bytes.NewReader(msg.Payload())) - if err != nil { - return nil,fmt.Errorf("failed to parse payload: %s\n", err) + return &Response{ + Raw: rawToken, + Payload: payload, + Header: header, + Valid: valid, + ValidateError: validateError, + }, nil +} + +func parseValidate(keys jwk.Set, msg *jws.Message) (jwt.Token, error, string) { + var ( + err error + token jwt.Token + options []jwt.ParseOption + validateError string + ) + + options = []jwt.ParseOption{jwt.WithValidate(true)} + if keys != nil { + options = append(options, jwt.WithKeySet(keys)) } - var header = make(map[string]interface{}) - signatures := msg.Signatures() - for _, signature := range signatures { - header, _ = signature.ProtectedHeaders().AsMap(context.TODO()) + if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload()), options...); err != nil { + validateError = err.Error() + // try to parse without validate + if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload())); err != nil { + // try to parse without validate + return nil, fmt.Errorf("failed to parse payload: %s\n", err), validateError + } } + return token, nil, validateError +} - return &Response{ - Payload: token, - Header: header, - },nil +func getJWTHeader(msg *jws.Message) (map[string]interface{}, error) { + hdr, err := msg.Signatures()[0].ProtectedHeaders().AsMap(context.TODO()) + if err != nil { + return nil, fmt.Errorf(`failed to parse token data: %v`, err) + } + return hdr, nil +} -} \ No newline at end of file +func newOptionalBool(b bool) *bool { + return &b +} diff --git a/internal/util/httputil.go b/internal/util/httputil.go index b2f7159..7fb8c99 100644 --- a/internal/util/httputil.go +++ b/internal/util/httputil.go @@ -1,9 +1,11 @@ package util import ( + "github.com/labstack/echo/v4" "net" "net/http" "net/url" + "strconv" "strings" ) @@ -90,3 +92,11 @@ func GetUrl(path string, request *http.Request) string { return url.String() } + +func GetBoolParam(ctx echo.Context, name string) bool { + value, err := strconv.ParseBool(ctx.QueryParam(name)) + if err != nil { + return false + } + return value +} From 94177facddfb794e49cc19520638e4d6d8348d4c Mon Sep 17 00:00:00 2001 From: Thomas Gunsch Date: Mon, 3 May 2021 19:07:02 +0200 Subject: [PATCH 3/3] add tests for JWT --- cmd/main.go | 24 ++++---- docs/swagger-ui.png | Bin 75915 -> 78011 bytes go.mod | 9 ++- go.sum | 21 +++++-- internal/cookies/handler.go | 13 +++-- internal/cookies/post_test.go | 2 +- internal/cookies/types.go | 22 +++++--- internal/docs/docs.go | 33 ++++++++++- internal/docs/swagger.json | 33 ++++++++++- internal/docs/swagger.yaml | 24 +++++++- internal/http/types.go | 14 ----- internal/jwt/get_test.go | 70 +++++++++++++++++++---- internal/jwt/handler.go | 8 +-- internal/jwt/jwt_test.go | 32 +++++++++++ internal/jwt/types.go | 101 +++++++++++----------------------- internal/util/httputil.go | 10 ---- 16 files changed, 261 insertions(+), 155 deletions(-) create mode 100644 internal/jwt/jwt_test.go diff --git a/cmd/main.go b/cmd/main.go index 0ee6e43..130cd3e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,7 +17,7 @@ import ( ) // @title httPod -// @version 0.0.1 +// @version 0.0.4 // @description A simple HTTP Request & HTTPResponse Service, shamelessly stolen from httpbin.org. // @tag.name HTTP Methods // @tag.description Testing different HTTP methods @@ -28,10 +28,10 @@ import ( func main() { const ( - SWAGGER_PATH = "/swagger" - API_PATH = "/api" - BASE_PATH_ENV = "BASE_PATH" - PORT = "PORT" + SwaggerPath = "/swagger" + ApiPath = "/api" + BasePathEnv = "BASE_PATH" + PORT = "PORT" ) server := echo.New() server.HideBanner = true @@ -40,7 +40,7 @@ func main() { if port == "" { port = "8080" } - basePath := os.Getenv(BASE_PATH_ENV) + basePath := os.Getenv(BasePathEnv) if basePath != "" { basePath = "/" + basePath } @@ -50,10 +50,10 @@ func main() { // api will be available on /basePath/api // swagger info will use X-Forwarded headers if available; // e.g.: X-Forwarded-Host=my.domain.com X-Forwarded-Prefix=myPrefix swagger ui show api on url http://my.domain.com/myPrefix/basePath/api - apiPath := basePath + API_PATH - endpoints.GET(SWAGGER_PATH+"/*", echoSwagger.WrapHandler, swaggerMiddleware(apiPath)) + apiPath := basePath + ApiPath + endpoints.GET(SwaggerPath+"/*", echoSwagger.WrapHandler, swaggerMiddleware(apiPath)) - api := endpoints.Group(API_PATH) + api := endpoints.Group(ApiPath) api.GET("/get", http.GetHandler) api.DELETE("/delete", http.DeleteHandler) api.PATCH("/patch", http.PatchHandler) @@ -72,14 +72,14 @@ func main() { api.GET("/jwt", jwt.GetHandler) - println(banner("http://localhost:" + port + SWAGGER_PATH + "/index.html")) + println(banner("http://localhost:" + port + SwaggerPath + "/index.html")) server.Logger.Fatal(server.Start(":" + port)) } -func banner(localUrl string) string { +func banner(localURL string) string { const BANNER = `/ˌeɪtʃ tiː tiː ˈpɒd/ %s trapping on %s` honeyPod := html.UnescapeString("&#" + strconv.Itoa(0x1f36f) + ";") - return fmt.Sprintf(BANNER, honeyPod, localUrl) + return fmt.Sprintf(BANNER, honeyPod, localURL) } func swaggerMiddleware(path string) echo.MiddlewareFunc { diff --git a/docs/swagger-ui.png b/docs/swagger-ui.png index d814a6bc850f35a42958ddb97f99f24e5096b138..a324eae1eccf50dafe5e1c0684abb0227293cb5a 100644 GIT binary patch literal 78011 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€v$w3=7K71;7nd3UitLAjwU-A=OMb%Nz&b2Wzq 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ÌPrmmp;fudS&fRY!$M1)d1GMC}%=Fi< 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 diff --git a/go.mod b/go.mod index 7d04bcf..600cb82 100644 --- a/go.mod +++ b/go.mod @@ -4,21 +4,24 @@ go 1.16 require ( github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/go-openapi/spec v0.20.3 // indirect github.com/go-openapi/swag v0.19.15 // indirect github.com/goccy/go-json v0.4.13 // indirect + github.com/jarcoal/httpmock v1.0.8 github.com/labstack/echo/v4 v4.2.2 github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect - github.com/lestrrat-go/jwx v1.1.7 + github.com/lestrrat-go/jwx v1.2.0 github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/nxadm/tail v1.4.6 // indirect github.com/onsi/ginkgo v1.14.2 github.com/onsi/gomega v1.10.1 + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/swaggo/echo-swagger v1.1.0 github.com/swaggo/swag v1.7.0 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect - golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 // indirect - golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect + golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 // indirect + golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324 // indirect golang.org/x/tools v0.1.0 // indirect ) diff --git a/go.sum b/go.sum index 312f284..8b4faed 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -20,6 +22,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= @@ -52,6 +55,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k= +github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -75,8 +80,8 @@ github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkO github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.1.7 h1:+PNt2U7FfrK4xn+ZCG+9jPRq5eqyG30gwpVwcekrCjA= -github.com/lestrrat-go/jwx v1.1.7/go.mod h1:Tg2uP7bpxEHUDtuWjap/PxroJ4okxGzkQznXiG+a5Dc= +github.com/lestrrat-go/jwx v1.2.0 h1:n08WEu8cJy3uzuQ39KWAOIhM4XfeozgaEGA8mTiioZ8= +github.com/lestrrat-go/jwx v1.2.0/go.mod h1:Tg2uP7bpxEHUDtuWjap/PxroJ4okxGzkQznXiG+a5Dc= github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= @@ -115,6 +120,9 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -129,6 +137,7 @@ github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01S github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -159,8 +168,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 h1:0PC75Fz/kyMGhL0e1QnypqK2kQMqKt9csD1GnMJR+Zk= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -184,8 +193,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 h1:iGu644GcxtEcrInvDsQRCwJjtCIOlT2V7IRt6ah2Whw= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324 h1:pAwJxDByZctfPwzlNGrDN2BQLsdPb9NkhoTJtUkAO28= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/internal/cookies/handler.go b/internal/cookies/handler.go index ebe58d1..c6cf4df 100644 --- a/internal/cookies/handler.go +++ b/internal/cookies/handler.go @@ -7,7 +7,8 @@ import ( "net/http" ) -// @Summary Get all cookies of the request. +// GetHandler for GET cookies +// @Summary Get all cookies of the request. // @Tags Cookies // @Description Requests using GET should only retrieve data. // @Accept json @@ -18,7 +19,7 @@ func GetHandler(context echo.Context) error { cookies := context.Cookies() getCookies := make([]GetCookies, len(cookies)) for i, cookie := range cookies { - getCookies[i] = toJsonCookie(cookie) + getCookies[i] = toJSONCookie(cookie) } prettyJSON, err := json.MarshalIndent(getCookies, "", " ") if err != nil { @@ -27,6 +28,7 @@ func GetHandler(context echo.Context) error { return context.String(http.StatusOK, string(prettyJSON)) } +// DeleteHandler for DELETE cookies // @Summary Delete a cookie. // @Tags Cookies // @Description Delete a specific cookie. @@ -43,7 +45,7 @@ func DeleteHandler(context echo.Context) error { Path: "/", } context.SetCookie(cookie) - getCookie := toJsonCookie(cookie) + getCookie := toJSONCookie(cookie) prettyJSON, err := json.MarshalIndent(getCookie, "", " ") if err != nil { return context.String(http.StatusBadRequest, fmt.Sprintf("Error parsing cookies: %v", err.Error())) @@ -51,6 +53,7 @@ func DeleteHandler(context echo.Context) error { return context.String(http.StatusOK, string(prettyJSON)) } +// PostHandler for creating new cookies // @Summary Create a new cookie. // @Tags Cookies // @Description @@ -68,12 +71,12 @@ func PostHandler(context echo.Context) error { return context.String(http.StatusBadRequest, fmt.Sprintf("Cookie %s already exists", name)) } - cookie, err := toHttpCookie(context) + cookie, err := toHTTPCookie(context) if err != nil { return context.String(http.StatusBadRequest, fmt.Sprintf("Oops: %v", err)) } context.SetCookie(cookie) - jsonCookie := toJsonCookie(cookie) + jsonCookie := toJSONCookie(cookie) prettyJSON, err := json.MarshalIndent(jsonCookie, "", " ") if err != nil { return context.String(http.StatusBadRequest, fmt.Sprintf("Error parsing cookies: %v", err.Error())) diff --git a/internal/cookies/post_test.go b/internal/cookies/post_test.go index 21a0b46..d6e7dae 100644 --- a/internal/cookies/post_test.go +++ b/internal/cookies/post_test.go @@ -55,7 +55,7 @@ var _ = Describe("PostHandler", func() { expireString := expireTime.UTC().Format(http.TimeFormat) Expect(setCookieHeader).Should(Equal("testCookie=testValue; Path=/blubb; Domain=myapp.com; Expires=" + expireString + "; HttpOnly; Secure; SameSite=Strict")) // response body contains json cookie - expireJson := expireTime.Format(cookies.TIME_FORMAT) + expireJson := expireTime.Format(cookies.TimeFormat) Expect(responseRecorder.Body.String()).To(MatchJSON(`{ "name": "testCookie", "value": "testValue", diff --git a/internal/cookies/types.go b/internal/cookies/types.go index e4db834..36254e5 100644 --- a/internal/cookies/types.go +++ b/internal/cookies/types.go @@ -9,12 +9,15 @@ import ( "time" ) -const TIME_FORMAT = "2006-01-02T15:04:05Z07:00" +// TimeFormat standard time format for response +const TimeFormat = "2006-01-02T15:04:05Z07:00" +// JSONTime for serializing time in TimeFormat type JSONTime struct { time.Time } +// GetCookies response for GET cookies type GetCookies struct { Name string `json:"name"` Value string `json:"value"` @@ -25,21 +28,22 @@ type GetCookies struct { RawExpires string `json:"rawExpires,omitempty"` MaxAge int `json:"maxAge,omitempty"` Secure bool `json:"secure,omitempty"` - HttpOnly bool `json:"httpOnly,omitempty"` + HTTPOnly bool `json:"httpOnly,omitempty"` SameSite string `json:"sameSite,omitempty"` } +// SetCookie request body for creating or updating cookies type SetCookie struct { Value string `json:"value" example:"Test"` Path string `json:"path,omitempty" example:"/"` ExpiresSeconds int `json:"expiresSeconds,omitempty" example:"3600"` MaxAge int `json:"maxAge,omitempty" example:"0"` Secure bool `json:"secure,omitempty" example:"true"` - HttpOnly bool `json:"httpOnly,omitempty" example:"true"` + HTTPOnly bool `json:"httpOnly,omitempty" example:"true"` SameSite string `json:"sameSite,omitempty" example:"Strict"` } -func toJsonCookie(cookie *http.Cookie) GetCookies { +func toJSONCookie(cookie *http.Cookie) GetCookies { var expires *JSONTime = nil if cookie.Expires.After(time.Time{}) { expires = &JSONTime{cookie.Expires} @@ -53,12 +57,12 @@ func toJsonCookie(cookie *http.Cookie) GetCookies { RawExpires: cookie.RawExpires, MaxAge: cookie.MaxAge, Secure: cookie.Secure, - HttpOnly: cookie.HttpOnly, + HTTPOnly: cookie.HttpOnly, SameSite: sameSiteString(cookie.SameSite), } } -func toHttpCookie(context echo.Context) (*http.Cookie, error) { +func toHTTPCookie(context echo.Context) (*http.Cookie, error) { cookie := new(SetCookie) if err := context.Bind(cookie); err != nil { return nil, err @@ -83,7 +87,7 @@ func toHttpCookie(context echo.Context) (*http.Cookie, error) { Expires: expires, MaxAge: maxAge, Secure: cookie.Secure, - HttpOnly: cookie.HttpOnly, + HttpOnly: cookie.HTTPOnly, SameSite: sameSite(cookie.SameSite), }, nil } @@ -116,8 +120,8 @@ func sameSite(s string) http.SameSite { } } +// MarshalJSON marshals a JSONTime in standard TimeFormat func (t JSONTime) MarshalJSON() ([]byte, error) { - //do your serializing here - stamp := fmt.Sprintf("\"%s\"", t.Format(TIME_FORMAT)) + stamp := fmt.Sprintf("\"%s\"", t.Format(TimeFormat)) return []byte(stamp), nil } diff --git a/internal/docs/docs.go b/internal/docs/docs.go index 695a438..b55cfb9 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -176,14 +176,22 @@ var doc = `{ "tags": [ "JWT" ], - "summary": "Get jwt of the request.", + "summary": "Get jwt passed as authorization bearer token of the request.", + "parameters": [ + { + "type": "string", + "description": "if set, the jwt is verified with the key received from jwks endpoint", + "name": "jwksUri", + "in": "query" + } + ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { - "$ref": "#/definitions/cookies.GetCookies" + "$ref": "#/definitions/jwt.Response" } } } @@ -659,6 +667,25 @@ var doc = `{ "type": "string" } } + }, + "jwt.Response": { + "type": "object", + "properties": { + "header": { + "type": "object", + "additionalProperties": true + }, + "payload": { + "type": "object", + "additionalProperties": true + }, + "raw": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + } } }, "tags": [ @@ -688,7 +715,7 @@ type swaggerInfo struct { // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = swaggerInfo{ - Version: "0.0.1", + Version: "0.0.4", Host: "", BasePath: "", Schemes: []string{}, diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index 6c1d99f..c06b648 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -4,7 +4,7 @@ "description": "A simple HTTP Request \u0026 HTTPResponse Service, shamelessly stolen from httpbin.org.", "title": "httPod", "contact": {}, - "version": "0.0.1" + "version": "0.0.4" }, "paths": { "/cookies": { @@ -159,14 +159,22 @@ "tags": [ "JWT" ], - "summary": "Get jwt of the request.", + "summary": "Get jwt passed as authorization bearer token of the request.", + "parameters": [ + { + "type": "string", + "description": "if set, the jwt is verified with the key received from jwks endpoint", + "name": "jwksUri", + "in": "query" + } + ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { - "$ref": "#/definitions/cookies.GetCookies" + "$ref": "#/definitions/jwt.Response" } } } @@ -642,6 +650,25 @@ "type": "string" } } + }, + "jwt.Response": { + "type": "object", + "properties": { + "header": { + "type": "object", + "additionalProperties": true + }, + "payload": { + "type": "object", + "additionalProperties": true + }, + "raw": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + } } }, "tags": [ diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index 4f173a9..2c85a19 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -68,12 +68,25 @@ definitions: url: type: string type: object + jwt.Response: + properties: + header: + additionalProperties: true + type: object + payload: + additionalProperties: true + type: object + raw: + type: string + valid: + type: boolean + type: object info: contact: {} description: A simple HTTP Request & HTTPResponse Service, shamelessly stolen from httpbin.org. title: httPod - version: 0.0.1 + version: 0.0.4 paths: /cookies: get: @@ -171,6 +184,11 @@ paths: consumes: - application/json description: Requests using GET should only retrieve data. + parameters: + - description: if set, the jwt is verified with the key received from jwks endpoint + in: query + name: jwksUri + type: string produces: - application/json responses: @@ -178,9 +196,9 @@ paths: description: OK schema: items: - $ref: '#/definitions/cookies.GetCookies' + $ref: '#/definitions/jwt.Response' type: array - summary: Get jwt of the request. + summary: Get jwt passed as authorization bearer token of the request. tags: - JWT /patch: diff --git a/internal/http/types.go b/internal/http/types.go index cf83726..65b9f78 100644 --- a/internal/http/types.go +++ b/internal/http/types.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "github.com/labstack/echo/v4" - "net/http" "strings" ) @@ -47,16 +46,3 @@ func getParams(c echo.Context) map[string]string { } return parameters } - -// getHost tries its best to return the request host. -func getHost(r *http.Request) string { - if r.URL.IsAbs() { - host := r.Host - // Slice off any port information. - if i := strings.Index(host, ":"); i != -1 { - host = host[:i] - } - return host - } - return r.URL.Host -} diff --git a/internal/jwt/get_test.go b/internal/jwt/get_test.go index 8caecbc..f81c0cf 100644 --- a/internal/jwt/get_test.go +++ b/internal/jwt/get_test.go @@ -2,16 +2,22 @@ package jwt_test import ( "fmt" + "github.com/jarcoal/httpmock" "github.com/labstack/echo/v4" + "github.com/lestrrat-go/jwx/jwa" + "github.com/lestrrat-go/jwx/jwk" + "github.com/lestrrat-go/jwx/jws" + jwt2 "github.com/lestrrat-go/jwx/jwt" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/tgunsch/httpod/internal/jwt" "net/http" "net/http/httptest" + "time" ) var _ = Describe("GetHandler", func() { - It("return a not validated jwt", func() { + It("return a jwt", func() { ctx, _, responseRecorder := mockGetContext("http://myapp.com/api/jwt", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") @@ -40,7 +46,16 @@ var _ = Describe("GetHandler", func() { }) It("return a validated jwt", func() { - ctx, _, responseRecorder := mockGetContext("http://myapp.com/api/jwt?validate=true", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4") + httpmock.Activate() + defer httpmock.DeactivateAndReset() + + key := createSymmetricKey("your-256-bit-secret", "12345") + + token := createToken(key) + + mockJWKSEndpoint(key, "http://my.jwks.com/jwks") + + ctx, _, responseRecorder := mockGetContext("http://myapp.com/api/jwt?jwksUri=http%3A%2F%2Fmy.jwks.com%2Fjwks", token) err := jwt.GetHandler(ctx) Expect(err).Should(BeNil()) @@ -50,26 +65,46 @@ var _ = Describe("GetHandler", func() { // response body contains json cookie Expect(responseRecorder.Body.String()).To(MatchJSON(`{ - "raw": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6Ijg4MmY3MWEzLWRiM2EtNGE2Ny05NTllLTZmZDE3MmFhYWNhMCIsImlhdCI6MTYxOTM0NjE2MywiZXhwIjoxNjE5MzQ5NzYzfQ.3GRfe59wu2KuXJyZV0uGqxpX6WWdeQTEsARbwow_ZG4", + "raw": "eyJhbGciOiJIUzI1NiIsImtpZCI6IjEyMzQ1IiwidHlwIjoiSldUIn0.eyJleHAiOjg3ODQ1NDg0MCwiaWF0Ijo0NTMyNzkxMjAsImlzcyI6InNreW5ldCIsInN1YiI6IlQtODAwIn0.GWYi_xOOQG3xzH6zhRFbomaIZ4xra6Accn0FhaZ_87A", "header": { "alg": "HS256", + "kid": "12345", "typ": "JWT" }, "payload": { - "admin": true, - "exp": "2021-04-25T11:22:43Z", - "iat": "2021-04-25T10:22:43Z", - "jti": "882f71a3-db3a-4a67-959e-6fd172aaaca0", - "name": "John Doe", - "sub": "1234567890" + "exp": "1997-11-02T07:14:00Z", + "iat": "1984-05-13T06:52:00Z", + "iss": "skynet", + "sub": "T-800" }, - "valid": false, - "validateError": "exp not satisfied" + "valid": true }`)) }) }) +func createSymmetricKey(value string, kid string) jwk.Key { + raw := []byte(value) + key, err := jwk.New(raw) + Expect(err).Should(BeNil()) + _ = key.Set("kid", kid) + _ = key.Set("alg", jwa.HS256) + return key +} + +func createToken(key jwk.Key) string { + loc, _ := time.LoadLocation("EST") + token := jwt2.New() + _ = token.Set(jwt2.IssuerKey, "skynet") + _ = token.Set(jwt2.ExpirationKey, time.Date(1997, 8, 94, 2, 14, 0, 0, loc).Unix()) + _ = token.Set(jwt2.IssuedAtKey, time.Date(1984, 05, 13, 1, 52, 0, 0, loc).Unix()) + _ = token.Set(jwt2.SubjectKey, "T-800") + headers := jws.NewHeaders() + _ = headers.Set(jws.KeyIDKey, key.KeyID()) + signedToken, _ := jwt2.Sign(token, jwa.HS256, key, jwt2.WithHeaders(headers)) + return string(signedToken) +} + func mockGetContext(uri string, token string) (echo.Context, *http.Request, *httptest.ResponseRecorder) { e := echo.New() req := httptest.NewRequest(http.MethodGet, uri, nil) @@ -79,3 +114,16 @@ func mockGetContext(uri string, token string) (echo.Context, *http.Request, *htt c := e.NewContext(req, res) return c, req, res } + +func mockJWKSEndpoint(key jwk.Key, jwksUrl string) { + + set := jwk.NewSet() + set.Add(key) + + responder := func(req *http.Request) (*http.Response, error) { + resp, err := httpmock.NewJsonResponse(200, set) + return resp, err + } + httpmock.RegisterResponder("GET", jwksUrl, responder) + +} diff --git a/internal/jwt/handler.go b/internal/jwt/handler.go index 94646c4..bc69482 100644 --- a/internal/jwt/handler.go +++ b/internal/jwt/handler.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/labstack/echo/v4" "github.com/lestrrat-go/jwx/jwk" - "github.com/tgunsch/httpod/internal/util" "net/http" ) @@ -15,9 +14,8 @@ import ( // @Description Requests using GET should only retrieve data. // @Accept json // @Produce json -// @Param validate query bool false "if true, the jwt is validated" // @Param jwksUri query string false "if set, the jwt is verified with the key received from jwks endpoint" -// @Success 200 {array} jwt.Token +// @Success 200 {array} jwt.Response // @Router /jwt [get] func GetHandler(ctx echo.Context) error { var ( @@ -26,7 +24,6 @@ func GetHandler(ctx echo.Context) error { err error response *Response prettyJSON []byte - validate bool ) auth = ctx.Request().Header.Get(echo.HeaderAuthorization) @@ -40,8 +37,7 @@ func GetHandler(ctx echo.Context) error { return ctx.String(http.StatusBadRequest, fmt.Sprintf("failed to validate token: %s\n", err)) } } - validate = util.GetBoolParam(ctx, "validate") - if response, err = NewResponse(rawToken, validate, keys); err != nil { + if response, err = NewResponse(rawToken, keys); err != nil { return ctx.String(http.StatusBadRequest, fmt.Sprintf("failed to parse payload: %s\n", err)) } diff --git a/internal/jwt/jwt_test.go b/internal/jwt/jwt_test.go new file mode 100644 index 0000000..34a40e2 --- /dev/null +++ b/internal/jwt/jwt_test.go @@ -0,0 +1,32 @@ +package jwt_test + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "strings" +) + +var _ = Describe("JWT", func() { + It("validate jwt", func() { + header := `{"alg":"HS256","typ":"JWT"}` + payload := `{"sub":"1234567890","name":"John Doe","iat":1516239022}` + unsignedToken := Base64Encode(header) + "." + Base64Encode(payload) + Expect(unsignedToken).To(Equal("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")) + + key := `your-256-bit-secret` + mac := hmac.New(sha256.New, []byte(key)) + mac.Write([]byte(unsignedToken)) + signature := mac.Sum(nil) + + token := unsignedToken + "." + Base64Encode(string(signature)) + Expect(token).To(Equal("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c")) + + }) +}) + +func Base64Encode(src string) string { + return strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(src)), "=") +} diff --git a/internal/jwt/types.go b/internal/jwt/types.go index 5433d16..344e58b 100644 --- a/internal/jwt/types.go +++ b/internal/jwt/types.go @@ -1,7 +1,6 @@ package jwt import ( - "bytes" "context" "fmt" "github.com/lestrrat-go/jwx/jwk" @@ -10,89 +9,53 @@ import ( ) type Response struct { - //Method SigningMethod // The signing method used or to be used - Raw string `json:"raw"` - Header map[string]interface{} `json:"header"` - Payload map[string]interface{} `json:"payload"` - Valid *bool `json:"valid,omitempty"` - ValidateError string `json:"validateError,omitempty"` + Raw string `json:"raw"` + Header map[string]interface{} `json:"header"` + Payload map[string]interface{} `json:"payload"` + Valid *bool `json:"valid,omitempty"` } -func NewResponse(rawToken string, validate bool, keys jwk.Set) (*Response, error) { +func NewResponse(rawToken string, keys jwk.Set) (*Response, error) { var ( - payload map[string]interface{} - header map[string]interface{} - err error - msg *jws.Message - token jwt.Token - valid *bool - validateError string + payload map[string]interface{} + header map[string]interface{} + err error + msg *jws.Message + token jwt.Token + valid *bool ) - if msg, err = jws.ParseString(rawToken); err != nil { - return nil, fmt.Errorf("failed to parse token data: %v", err) - } - - if validate { - if token, err, validateError = parseValidate(keys, msg); err != nil { - return nil, err - } - if validateError != "" { - valid = newOptionalBool(false) - } - } else { - if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload())); err != nil { - // try to parse without validate - return nil, fmt.Errorf("failed to parse payload: %s\n", err) - } + // payload + if token, err = jwt.ParseString(rawToken); err != nil { + return nil, fmt.Errorf("failed to parse payload: %s\n", err) } - if payload, err = token.AsMap(context.TODO()); err != nil { return nil, err } - if header, err = getJWTHeader(msg); err != nil { - return nil, err - } - - return &Response{ - Raw: rawToken, - Payload: payload, - Header: header, - Valid: valid, - ValidateError: validateError, - }, nil -} -func parseValidate(keys jwk.Set, msg *jws.Message) (jwt.Token, error, string) { - var ( - err error - token jwt.Token - options []jwt.ParseOption - validateError string - ) - - options = []jwt.ParseOption{jwt.WithValidate(true)} - if keys != nil { - options = append(options, jwt.WithKeySet(keys)) + // header + if msg, err = jws.ParseString(rawToken); err != nil { + return nil, fmt.Errorf("failed to parse token data: %v", err) + } + if header, err = msg.Signatures()[0].ProtectedHeaders().AsMap(context.TODO()); err != nil { + return nil, fmt.Errorf(`failed to parse token data: %v`, err) } - if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload()), options...); err != nil { - validateError = err.Error() - // try to parse without validate - if token, err = jwt.ParseReader(bytes.NewReader(msg.Payload())); err != nil { - // try to parse without validate - return nil, fmt.Errorf("failed to parse payload: %s\n", err), validateError + // verify + if keys != nil { + if _, err = jws.VerifySet([]byte(rawToken), keys); err != nil { + valid = newOptionalBool(false) + } else { + valid = newOptionalBool(true) } } - return token, nil, validateError -} -func getJWTHeader(msg *jws.Message) (map[string]interface{}, error) { - hdr, err := msg.Signatures()[0].ProtectedHeaders().AsMap(context.TODO()) - if err != nil { - return nil, fmt.Errorf(`failed to parse token data: %v`, err) - } - return hdr, nil + return &Response{ + Raw: rawToken, + Payload: payload, + Header: header, + Valid: valid, + }, nil } func newOptionalBool(b bool) *bool { diff --git a/internal/util/httputil.go b/internal/util/httputil.go index 7fb8c99..b2f7159 100644 --- a/internal/util/httputil.go +++ b/internal/util/httputil.go @@ -1,11 +1,9 @@ package util import ( - "github.com/labstack/echo/v4" "net" "net/http" "net/url" - "strconv" "strings" ) @@ -92,11 +90,3 @@ func GetUrl(path string, request *http.Request) string { return url.String() } - -func GetBoolParam(ctx echo.Context, name string) bool { - value, err := strconv.ParseBool(ctx.QueryParam(name)) - if err != nil { - return false - } - return value -}