From f743be6f99825b87666eea6afd8a6bea082c25d1 Mon Sep 17 00:00:00 2001 From: Sergiu Ghitea <28300158+sergiught@users.noreply.github.com> Date: Mon, 21 Nov 2022 17:06:47 +0100 Subject: [PATCH] Fix examples (#184) --- examples/gin-example/go.mod | 2 +- examples/http-example/go.mod | 15 ++++ examples/http-example/go.sum | 11 +++ examples/http-example/main_test.go | 75 +++++++++--------- examples/http-jwks-example/go.mod | 15 ++++ examples/http-jwks-example/go.sum | 11 +++ examples/http-jwks-example/main_test.go | 101 +++++++++++------------- 7 files changed, 137 insertions(+), 93 deletions(-) create mode 100644 examples/http-example/go.mod create mode 100644 examples/http-example/go.sum create mode 100644 examples/http-jwks-example/go.mod create mode 100644 examples/http-jwks-example/go.sum diff --git a/examples/gin-example/go.mod b/examples/gin-example/go.mod index d543385..a01d1aa 100644 --- a/examples/gin-example/go.mod +++ b/examples/gin-example/go.mod @@ -3,7 +3,7 @@ module example.com/gin go 1.19 require ( - github.com/auth0/go-jwt-middleware/v2 v2.0.1 + github.com/auth0/go-jwt-middleware/v2 v2.1.0 github.com/gin-gonic/gin v1.8.1 ) diff --git a/examples/http-example/go.mod b/examples/http-example/go.mod new file mode 100644 index 0000000..f18ac83 --- /dev/null +++ b/examples/http-example/go.mod @@ -0,0 +1,15 @@ +module example.com/http + +go 1.19 + +require ( + github.com/auth0/go-jwt-middleware/v2 v2.1.0 + gopkg.in/square/go-jose.v2 v2.6.0 +) + +replace github.com/auth0/go-jwt-middleware/v2 => ./../../ + +require ( + github.com/pkg/errors v0.9.1 // indirect + golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 // indirect +) diff --git a/examples/http-example/go.sum b/examples/http-example/go.sum new file mode 100644 index 0000000..4a58395 --- /dev/null +++ b/examples/http-example/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 h1:SLP7Q4Di66FONjDJbCYrCRrh97focO6sLogHO7/g8F0= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/examples/http-example/main_test.go b/examples/http-example/main_test.go index 6237540..93c8638 100644 --- a/examples/http-example/main_test.go +++ b/examples/http-example/main_test.go @@ -9,40 +9,8 @@ import ( "gopkg.in/square/go-jose.v2/jwt" ) -func buildJWTForTesting(t *testing.T, username string) string { - t.Helper() - - key := jose.SigningKey{ - Algorithm: jose.HS256, - Key: signingKey, - } - signer, err := jose.NewSigner(key, (&jose.SignerOptions{}).WithType("JWT")) - if err != nil { - t.Fatalf("could not build signer: %s", err.Error()) - } - - claims := jwt.Claims{ - Issuer: issuer, - Audience: audience, - } - customClaims := CustomClaimsExample{ - Username: username, - } - - token, err := jwt.Signed(signer). - Claims(claims). - Claims(customClaims). - CompactSerialize() - - if err != nil { - t.Fatalf("could not build token: %s", err.Error()) - } - - return token -} - func TestHandler(t *testing.T) { - tests := []struct { + testCases := []struct { name string username string wantStatusCode int @@ -59,24 +27,53 @@ func TestHandler(t *testing.T) { }, } - for _, test := range tests { + for _, test := range testCases { t.Run(test.name, func(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, "", nil) + request, err := http.NewRequest(http.MethodGet, "", nil) if err != nil { t.Fatal(err) } token := buildJWTForTesting(t, test.username) - req.Header.Set("Authorization", "Bearer "+token) + request.Header.Set("Authorization", "Bearer "+token) - rr := httptest.NewRecorder() + responseRecorder := httptest.NewRecorder() mainHandler := setupHandler() - mainHandler.ServeHTTP(rr, req) + mainHandler.ServeHTTP(responseRecorder, request) - if want, got := test.wantStatusCode, rr.Code; want != got { + if want, got := test.wantStatusCode, responseRecorder.Code; want != got { t.Fatalf("wanted status code %d, but got status code %d", want, got) } }) } } + +func buildJWTForTesting(t *testing.T, username string) string { + t.Helper() + + key := jose.SigningKey{ + Algorithm: jose.HS256, + Key: signingKey, + } + + signer, err := jose.NewSigner(key, (&jose.SignerOptions{}).WithType("JWT")) + if err != nil { + t.Fatalf("could not build signer: %s", err.Error()) + } + + claims := jwt.Claims{ + Issuer: issuer, + Audience: audience, + } + customClaims := CustomClaimsExample{ + Username: username, + } + + token, err := jwt.Signed(signer).Claims(claims).Claims(customClaims).CompactSerialize() + if err != nil { + t.Fatalf("could not build token: %s", err.Error()) + } + + return token +} diff --git a/examples/http-jwks-example/go.mod b/examples/http-jwks-example/go.mod new file mode 100644 index 0000000..5b0e589 --- /dev/null +++ b/examples/http-jwks-example/go.mod @@ -0,0 +1,15 @@ +module example.com/http-jwks + +go 1.19 + +require ( + github.com/auth0/go-jwt-middleware/v2 v2.1.0 + gopkg.in/square/go-jose.v2 v2.6.0 +) + +replace github.com/auth0/go-jwt-middleware/v2 => ./../../ + +require ( + github.com/pkg/errors v0.9.1 // indirect + golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 // indirect +) diff --git a/examples/http-jwks-example/go.sum b/examples/http-jwks-example/go.sum new file mode 100644 index 0000000..4a58395 --- /dev/null +++ b/examples/http-jwks-example/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 h1:SLP7Q4Di66FONjDJbCYrCRrh97focO6sLogHO7/g8F0= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/examples/http-jwks-example/main_test.go b/examples/http-jwks-example/main_test.go index 44475ad..97b0b78 100644 --- a/examples/http-jwks-example/main_test.go +++ b/examples/http-jwks-example/main_test.go @@ -10,46 +10,10 @@ import ( "gopkg.in/square/go-jose.v2" "gopkg.in/square/go-jose.v2/jwt" - - "github.com/auth0/go-jwt-middleware/v2/internal/oidc" ) -func buildJWTForTesting(t *testing.T, jwk *jose.JSONWebKey, issuer, subject string, audience []string) string { - t.Helper() - - key := jose.SigningKey{ - Algorithm: jose.SignatureAlgorithm(jwk.Algorithm), - Key: jwk, - } - signer, err := jose.NewSigner(key, (&jose.SignerOptions{}).WithType("JWT")) - if err != nil { - t.Fatalf("could not build signer: %s", err.Error()) - } - - claims := jwt.Claims{ - Issuer: issuer, - Audience: audience, - Subject: subject, - } - - token, err := jwt.Signed(signer). - Claims(claims). - CompactSerialize() - - if err != nil { - t.Fatalf("could not build token: %s", err.Error()) - } - - return token -} - func TestHandler(t *testing.T) { - jwk := generateJWK(t) - - testServer := setupTestServer(t, jwk) - defer testServer.Close() - - tests := []struct { + testCases := []struct { name string subject string wantStatusCode int @@ -66,22 +30,27 @@ func TestHandler(t *testing.T) { }, } - for _, test := range tests { + jwk := generateJWK(t) + + testServer := setupTestServer(t, jwk) + defer testServer.Close() + + for _, test := range testCases { t.Run(test.name, func(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, "", nil) + request, err := http.NewRequest(http.MethodGet, "", nil) if err != nil { t.Fatal(err) } token := buildJWTForTesting(t, jwk, testServer.URL, test.subject, []string{"my-audience"}) - req.Header.Set("Authorization", "Bearer "+token) + request.Header.Set("Authorization", "Bearer "+token) - rr := httptest.NewRecorder() + responseRecorder := httptest.NewRecorder() mainHandler := setupHandler(testServer.URL, []string{"my-audience"}) - mainHandler.ServeHTTP(rr, req) + mainHandler.ServeHTTP(responseRecorder, request) - if want, got := test.wantStatusCode, rr.Code; want != got { + if want, got := test.wantStatusCode, responseRecorder.Code; want != got { t.Fatalf("wanted status code %d, but got status code %d", want, got) } }) @@ -104,25 +73,24 @@ func generateJWK(t *testing.T) *jose.JSONWebKey { } } -func setupTestServer( - t *testing.T, - jwk *jose.JSONWebKey, -) (server *httptest.Server) { +func setupTestServer(t *testing.T, jwk *jose.JSONWebKey) (server *httptest.Server) { t.Helper() var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.String() { case "/.well-known/openid-configuration": - wk := oidc.WellKnownEndpoints{JWKSURI: server.URL + "/.well-known/jwks.json"} - err := json.NewEncoder(w).Encode(wk) - if err != nil { + wk := struct { + JWKSURI string `json:"jwks_uri"` + }{ + JWKSURI: server.URL + "/.well-known/jwks.json", + } + if err := json.NewEncoder(w).Encode(wk); err != nil { t.Fatal(err) } case "/.well-known/jwks.json": - err := json.NewEncoder(w).Encode(jose.JSONWebKeySet{ + if err := json.NewEncoder(w).Encode(jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{jwk.Public()}, - }) - if err != nil { + }); err != nil { t.Fatal(err) } default: @@ -132,3 +100,30 @@ func setupTestServer( return httptest.NewServer(handler) } + +func buildJWTForTesting(t *testing.T, jwk *jose.JSONWebKey, issuer, subject string, audience []string) string { + t.Helper() + + key := jose.SigningKey{ + Algorithm: jose.SignatureAlgorithm(jwk.Algorithm), + Key: jwk, + } + + signer, err := jose.NewSigner(key, (&jose.SignerOptions{}).WithType("JWT")) + if err != nil { + t.Fatalf("could not build signer: %s", err.Error()) + } + + claims := jwt.Claims{ + Issuer: issuer, + Audience: audience, + Subject: subject, + } + + token, err := jwt.Signed(signer).Claims(claims).CompactSerialize() + if err != nil { + t.Fatalf("could not build token: %s", err.Error()) + } + + return token +}