Skip to content

Commit f5c7e8e

Browse files
committed
feat: support multiple issuer:audience combinations by introducing an option for the expectedClaims. WithExpectedClaims can be called with multiple jwt.Expected parameters to allow different Issuer:Audience combinations to validate tokens
feat: support multiple issuers in a provider using WithAdditionalIssuers option Every effort has been made to ensure backwards compatibility. Some error messages will be different due to the wrapping of errors when multiple jwt.Expected are set. When validating the jwt, if an error is encountered, instead of returning immediately, the current error is wrapped. This is good and bad. Good because all verification failure causes are captured in a single wrapped error; Bad because all verification failure causes are captured in a single monolithic wrapped error. Unwrapping the error can be tedious if many jwt.Expected are included. There is likely a better way but this suits my purposes. A few more test cases will likely be needed in order to achieve true confidence in this change
1 parent b4b1b5f commit f5c7e8e

File tree

23 files changed

+676
-94
lines changed

23 files changed

+676
-94
lines changed

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import (
4343
"log"
4444
"net/http"
4545

46-
"github.com/auth0/go-jwt-middleware/v2"
4746
"github.com/auth0/go-jwt-middleware/v2/validator"
4847
jwtmiddleware "github.com/auth0/go-jwt-middleware/v2"
4948
)

examples/echo-example/go.mod

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module example.com/echo
22

3-
go 1.20
3+
go 1.22.3
4+
5+
toolchain go1.22.4
46

57
require (
68
github.com/auth0/go-jwt-middleware/v2 v2.1.0
@@ -15,9 +17,9 @@ require (
1517
github.com/mattn/go-isatty v0.0.19 // indirect
1618
github.com/valyala/bytebufferpool v1.0.0 // indirect
1719
github.com/valyala/fasttemplate v1.2.2 // indirect
18-
golang.org/x/crypto v0.17.0 // indirect
20+
golang.org/x/crypto v0.19.0 // indirect
1921
golang.org/x/net v0.17.0 // indirect
20-
golang.org/x/sys v0.15.0 // indirect
22+
golang.org/x/sys v0.17.0 // indirect
2123
golang.org/x/text v0.14.0 // indirect
22-
gopkg.in/go-jose/go-jose.v2 v2.6.2 // indirect
24+
gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
2325
)

examples/echo-example/go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ
2525
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
2626
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
2727
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
28+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
2829
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
2930
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
3031
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -34,11 +35,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
3435
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3536
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
3637
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
38+
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
3739
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
3840
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
3941
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
4042
gopkg.in/go-jose/go-jose.v2 v2.6.2 h1:Rl5+9rA0kG3vsO1qhncMPRT5eHICihAMQYJkD7u/i4M=
4143
gopkg.in/go-jose/go-jose.v2 v2.6.2/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
44+
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
4245
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
4346
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
4447
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

examples/gin-example/go.mod

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
module example.com/gin
22

3-
go 1.19
3+
go 1.22.3
4+
5+
toolchain go1.22.4
46

57
require (
68
github.com/auth0/go-jwt-middleware/v2 v2.1.0
79
github.com/gin-gonic/gin v1.9.1
10+
gopkg.in/go-jose/go-jose.v2 v2.6.3
811
)
912

1013
replace github.com/auth0/go-jwt-middleware/v2 => ./../../
@@ -26,14 +29,14 @@ require (
2629
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2730
github.com/modern-go/reflect2 v1.0.2 // indirect
2831
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
32+
github.com/pkg/errors v0.9.1 // indirect
2933
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
3034
github.com/ugorji/go/codec v1.2.11 // indirect
3135
golang.org/x/arch v0.5.0 // indirect
32-
golang.org/x/crypto v0.17.0 // indirect
36+
golang.org/x/crypto v0.19.0 // indirect
3337
golang.org/x/net v0.17.0 // indirect
34-
golang.org/x/sys v0.15.0 // indirect
38+
golang.org/x/sys v0.17.0 // indirect
3539
golang.org/x/text v0.14.0 // indirect
3640
google.golang.org/protobuf v1.31.0 // indirect
37-
gopkg.in/go-jose/go-jose.v2 v2.6.2 // indirect
3841
gopkg.in/yaml.v3 v3.0.1 // indirect
3942
)

examples/gin-example/go.sum

+12-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
1818
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
1919
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
2020
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
21+
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
2122
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
2223
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
2324
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
@@ -29,6 +30,7 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
2930
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
3031
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
3132
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
33+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
3234
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
3335
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
3436
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
@@ -47,6 +49,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
4749
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
4850
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
4951
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
52+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
53+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5054
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5155
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5256
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -58,23 +62,24 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
5862
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
5963
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
6064
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
61-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
6265
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
66+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
67+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
6368
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
6469
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
6570
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
6671
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
6772
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
6873
golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y=
6974
golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
70-
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
71-
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
75+
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
76+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
7277
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
7378
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
7479
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7580
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
76-
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
77-
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
81+
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
82+
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
7883
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
7984
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
8085
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -83,8 +88,8 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs
8388
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
8489
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8590
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
86-
gopkg.in/go-jose/go-jose.v2 v2.6.2 h1:Rl5+9rA0kG3vsO1qhncMPRT5eHICihAMQYJkD7u/i4M=
87-
gopkg.in/go-jose/go-jose.v2 v2.6.2/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
91+
gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs=
92+
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
8893
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
8994
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
9095
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

examples/gin-example/main.go

+52-2
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,29 @@ import (
3939
// "username": "user123",
4040
// "shouldReject": true
4141
// }
42+
//
43+
// You can also try out the /multiple endpoint. This endpoint accepts tokens signed by multiple issuers. Try the
44+
// token below which has a different issuer:
45+
//
46+
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnby1qd3QtbWlkZGxld2FyZS1tdWx0aXBsZS1leGFtcGxlIiwiYXVkIjoiYXVkaWVuY2UtbXVsdGlwbGUtZXhhbXBsZSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1MTYyMzkwMjIsInVzZXJuYW1lIjoidXNlcjEyMyJ9.9zV_bY1wAmQlMCPlXOppx1Y9_z_T_wNng9-yfQk4I0c
47+
//
48+
// which is signed with 'secret' and has the data:
49+
//
50+
// {
51+
// "iss": "go-jwt-middleware-multiple-example",
52+
// "aud": "audience-multiple-example",
53+
// "sub": "1234567890",
54+
// "name": "John Doe",
55+
// "iat": 1516239022,
56+
// "username": "user123"
57+
// }
58+
//
59+
// You can also try the previous tokens with the /multiple endpoint. The first token will be valid the second will fail because
60+
// the custom validator rejects it (shouldReject: true)
4261

4362
func main() {
4463
router := gin.Default()
64+
4565
router.GET("/", checkJWT(), func(ctx *gin.Context) {
4666
claims, ok := ctx.Request.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims)
4767
if !ok {
@@ -52,7 +72,37 @@ func main() {
5272
return
5373
}
5474

55-
customClaims, ok := claims.CustomClaims.(*CustomClaimsExample)
75+
localCustomClaims, ok := claims.CustomClaims.(*CustomClaimsExample)
76+
if !ok {
77+
ctx.AbortWithStatusJSON(
78+
http.StatusInternalServerError,
79+
map[string]string{"message": "Failed to cast custom JWT claims to specific type."},
80+
)
81+
return
82+
}
83+
84+
if len(localCustomClaims.Username) == 0 {
85+
ctx.AbortWithStatusJSON(
86+
http.StatusBadRequest,
87+
map[string]string{"message": "Username in JWT claims was empty."},
88+
)
89+
return
90+
}
91+
92+
ctx.JSON(http.StatusOK, claims)
93+
})
94+
95+
router.GET("/multiple", checkJWTMultiple(), func(ctx *gin.Context) {
96+
claims, ok := ctx.Request.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims)
97+
if !ok {
98+
ctx.AbortWithStatusJSON(
99+
http.StatusInternalServerError,
100+
map[string]string{"message": "Failed to get validated JWT claims."},
101+
)
102+
return
103+
}
104+
105+
localCustomClaims, ok := claims.CustomClaims.(*CustomClaimsExample)
56106
if !ok {
57107
ctx.AbortWithStatusJSON(
58108
http.StatusInternalServerError,
@@ -61,7 +111,7 @@ func main() {
61111
return
62112
}
63113

64-
if len(customClaims.Username) == 0 {
114+
if len(localCustomClaims.Username) == 0 {
65115
ctx.AbortWithStatusJSON(
66116
http.StatusBadRequest,
67117
map[string]string{"message": "Username in JWT claims was empty."},

examples/gin-example/middleware.go

+52-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"context"
5+
"gopkg.in/go-jose/go-jose.v2/jwt"
56
"log"
67
"net/http"
78
"time"
@@ -16,10 +17,12 @@ var (
1617
signingKey = []byte("secret")
1718

1819
// The issuer of our token.
19-
issuer = "go-jwt-middleware-example"
20+
issuer = "go-jwt-middleware-example"
21+
issuerTwo = "go-jwt-middleware-multiple-example"
2022

2123
// The audience of our token.
22-
audience = []string{"audience-example"}
24+
audience = []string{"audience-example"}
25+
audienceTwo = []string{"audience-multiple-example"}
2326

2427
// Our token must be signed using this data.
2528
keyFunc = func(ctx context.Context) (interface{}, error) {
@@ -76,3 +79,50 @@ func checkJWT() gin.HandlerFunc {
7679
}
7780
}
7881
}
82+
83+
func checkJWTMultiple() gin.HandlerFunc {
84+
// Set up the validator.
85+
jwtValidator, err := validator.NewValidator(
86+
keyFunc,
87+
validator.HS256,
88+
validator.WithCustomClaims(customClaims),
89+
validator.WithAllowedClockSkew(30*time.Second),
90+
validator.WithExpectedClaims(jwt.Expected{
91+
Issuer: issuer,
92+
Audience: audience,
93+
}, jwt.Expected{
94+
Issuer: issuerTwo,
95+
Audience: audienceTwo,
96+
}),
97+
)
98+
if err != nil {
99+
log.Fatalf("failed to set up the validator: %v", err)
100+
}
101+
102+
errorHandler := func(w http.ResponseWriter, r *http.Request, err error) {
103+
log.Printf("Encountered error while validating JWT: %v", err)
104+
}
105+
106+
middleware := jwtmiddleware.New(
107+
jwtValidator.ValidateToken,
108+
jwtmiddleware.WithErrorHandler(errorHandler),
109+
)
110+
111+
return func(ctx *gin.Context) {
112+
encounteredError := true
113+
var handler http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
114+
encounteredError = false
115+
ctx.Request = r
116+
ctx.Next()
117+
}
118+
119+
middleware.CheckJWT(handler).ServeHTTP(ctx.Writer, ctx.Request)
120+
121+
if encounteredError {
122+
ctx.AbortWithStatusJSON(
123+
http.StatusUnauthorized,
124+
map[string]string{"message": "JWT is invalid."},
125+
)
126+
}
127+
}
128+
}

examples/http-example/go.mod

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
module example.com/http
22

3-
go 1.19
3+
go 1.22.3
4+
5+
toolchain go1.22.4
46

57
require (
68
github.com/auth0/go-jwt-middleware/v2 v2.1.0
7-
gopkg.in/go-jose/go-jose.v2 v2.6.2
9+
gopkg.in/go-jose/go-jose.v2 v2.6.3
810
)
911

1012
replace github.com/auth0/go-jwt-middleware/v2 => ./../../
1113

12-
require golang.org/x/crypto v0.17.0 // indirect
14+
require golang.org/x/crypto v0.19.0 // indirect

examples/http-example/go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
44
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
55
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
66
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
7+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
78
gopkg.in/go-jose/go-jose.v2 v2.6.2 h1:Rl5+9rA0kG3vsO1qhncMPRT5eHICihAMQYJkD7u/i4M=
89
gopkg.in/go-jose/go-jose.v2 v2.6.2/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
10+
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
911
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

examples/http-example/main.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import (
88
"net/http"
99
"time"
1010

11-
"github.com/auth0/go-jwt-middleware/v2"
12-
"github.com/auth0/go-jwt-middleware/v2/validator"
1311
jwtmiddleware "github.com/auth0/go-jwt-middleware/v2"
12+
"github.com/auth0/go-jwt-middleware/v2/validator"
1413
)
1514

1615
var (

examples/http-jwks-example/go.mod

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
module example.com/http-jwks
22

3-
go 1.19
3+
go 1.22.3
4+
5+
toolchain go1.22.4
46

57
require (
68
github.com/auth0/go-jwt-middleware/v2 v2.1.0
7-
gopkg.in/go-jose/go-jose.v2 v2.6.2
9+
gopkg.in/go-jose/go-jose.v2 v2.6.3
810
)
911

1012
replace github.com/auth0/go-jwt-middleware/v2 => ./../../
1113

1214
require (
13-
golang.org/x/crypto v0.17.0 // indirect
14-
golang.org/x/sync v0.5.0 // indirect
15+
golang.org/x/crypto v0.19.0 // indirect
16+
golang.org/x/sync v0.7.0 // indirect
1517
)

examples/http-jwks-example/go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
44
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
55
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
66
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
7+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
78
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
89
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
10+
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
11+
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
912
gopkg.in/go-jose/go-jose.v2 v2.6.2 h1:Rl5+9rA0kG3vsO1qhncMPRT5eHICihAMQYJkD7u/i4M=
1013
gopkg.in/go-jose/go-jose.v2 v2.6.2/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
14+
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
1115
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

examples/http-jwks-example/main.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ import (
77
"net/url"
88
"time"
99

10-
"github.com/auth0/go-jwt-middleware/v2"
10+
jwtmiddleware "github.com/auth0/go-jwt-middleware/v2"
1111
"github.com/auth0/go-jwt-middleware/v2/jwks"
1212
"github.com/auth0/go-jwt-middleware/v2/validator"
13-
jwtmiddleware "github.com/auth0/go-jwt-middleware/v2"
1413
)
1514

1615
var handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

0 commit comments

Comments
 (0)