@@ -54,6 +54,15 @@ type GinJWTMiddleware struct {
54
54
55
55
// User can define own Unauthorized func.
56
56
Unauthorized func (* gin.Context , int , string )
57
+
58
+ // TokenLookup is a string in the form of "<source>:<name>" that is used
59
+ // to extract token from the request.
60
+ // Optional. Default value "header:Authorization".
61
+ // Possible values:
62
+ // - "header:<name>"
63
+ // - "query:<name>"
64
+ // - "cookie:<name>"
65
+ TokenLookup string
57
66
}
58
67
59
68
// Login form structure.
@@ -65,6 +74,10 @@ type Login struct {
65
74
// MiddlewareInit initialize jwt configs.
66
75
func (mw * GinJWTMiddleware ) MiddlewareInit () error {
67
76
77
+ if mw .TokenLookup == "" {
78
+ mw .TokenLookup = "header:Authorization"
79
+ }
80
+
68
81
if mw .SigningAlgorithm == "" {
69
82
mw .SigningAlgorithm = "HS256"
70
83
}
@@ -267,19 +280,40 @@ func (mw *GinJWTMiddleware) TokenGenerator(userID string) string {
267
280
return tokenString
268
281
}
269
282
270
- func (mw * GinJWTMiddleware ) parseToken (c * gin.Context ) (* jwt. Token , error ) {
283
+ func (mw * GinJWTMiddleware ) jwtFromHeader (c * gin.Context , key string ) (string , error ) {
271
284
authHeader := c .Request .Header .Get ("Authorization" )
272
285
273
286
if authHeader == "" {
274
- return nil , errors .New ("auth header empty" )
287
+ return "" , errors .New ("auth header empty" )
275
288
}
276
289
277
290
parts := strings .SplitN (authHeader , " " , 2 )
278
291
if ! (len (parts ) == 2 && parts [0 ] == "Bearer" ) {
279
- return nil , errors .New ("invalid auth header" )
292
+ return "" , errors .New ("invalid auth header" )
293
+ }
294
+
295
+ return parts [1 ], nil
296
+ }
297
+
298
+ func (mw * GinJWTMiddleware ) parseToken (c * gin.Context ) (* jwt.Token , error ) {
299
+ var token string
300
+ var err error
301
+
302
+ parts := strings .Split (mw .TokenLookup , ":" )
303
+ switch parts [0 ] {
304
+ case "header" :
305
+ token , err = mw .jwtFromHeader (c , parts [1 ])
306
+ // case "query":
307
+ // token, err = jwtFromQuery(parts[1])
308
+ // case "cookie":
309
+ // token, err = jwtFromCookie(parts[1])
310
+ }
311
+
312
+ if err != nil {
313
+ return nil , err
280
314
}
281
315
282
- return jwt .Parse (parts [ 1 ] , func (token * jwt.Token ) (interface {}, error ) {
316
+ return jwt .Parse (token , func (token * jwt.Token ) (interface {}, error ) {
283
317
if jwt .GetSigningMethod (mw .SigningAlgorithm ) != token .Method {
284
318
return nil , errors .New ("invalid signing algorithm" )
285
319
}
0 commit comments