Skip to content

Commit de3f87e

Browse files
authored
Jwt lookup from multiple sources (#1845)
* Jwt lookup from multiple sources
1 parent 7256cb2 commit de3f87e

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

middleware/jwt.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,24 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
160160
}
161161

162162
// Initialize
163-
parts := strings.Split(config.TokenLookup, ":")
164-
extractor := jwtFromHeader(parts[1], config.AuthScheme)
165-
switch parts[0] {
166-
case "query":
167-
extractor = jwtFromQuery(parts[1])
168-
case "param":
169-
extractor = jwtFromParam(parts[1])
170-
case "cookie":
171-
extractor = jwtFromCookie(parts[1])
172-
case "form":
173-
extractor = jwtFromForm(parts[1])
163+
// Split sources
164+
sources := strings.Split(config.TokenLookup, ",")
165+
var extractors []jwtExtractor
166+
for _, source := range sources {
167+
parts := strings.Split(source, ":")
168+
169+
switch parts[0] {
170+
case "query":
171+
extractors = append(extractors, jwtFromQuery(parts[1]))
172+
case "param":
173+
extractors = append(extractors, jwtFromParam(parts[1]))
174+
case "cookie":
175+
extractors = append(extractors, jwtFromCookie(parts[1]))
176+
case "form":
177+
extractors = append(extractors, jwtFromForm(parts[1]))
178+
case "header":
179+
extractors = append(extractors, jwtFromHeader(parts[1], config.AuthScheme))
180+
}
174181
}
175182

176183
return func(next echo.HandlerFunc) echo.HandlerFunc {
@@ -182,8 +189,17 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
182189
if config.BeforeFunc != nil {
183190
config.BeforeFunc(c)
184191
}
185-
186-
auth, err := extractor(c)
192+
var auth string
193+
var err error
194+
for _, extractor := range extractors {
195+
// Extract token from extractor, if it's not fail break the loop and
196+
// set auth
197+
auth, err = extractor(c)
198+
if err == nil {
199+
break
200+
}
201+
}
202+
// If none of extractor has a token, handle error
187203
if err != nil {
188204
if config.ErrorHandler != nil {
189205
return config.ErrorHandler(err)
@@ -194,6 +210,7 @@ func JWTWithConfig(config JWTConfig) echo.MiddlewareFunc {
194210
}
195211
return err
196212
}
213+
197214
token := new(jwt.Token)
198215
// Issue #647, #656
199216
if _, ok := config.Claims.(jwt.MapClaims); ok {

middleware/jwt_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,14 @@ func TestJWT(t *testing.T) {
179179
hdrCookie: "jwt=" + token,
180180
info: "Valid cookie method",
181181
},
182+
{
183+
config: JWTConfig{
184+
SigningKey: validKey,
185+
TokenLookup: "query:jwt,cookie:jwt",
186+
},
187+
hdrCookie: "jwt=" + token,
188+
info: "Multiple jwt lookuop",
189+
},
182190
{
183191
config: JWTConfig{
184192
SigningKey: validKey,

0 commit comments

Comments
 (0)