Skip to content

Commit 8841014

Browse files
committed
Add get from header function.
Signed-off-by: Bo-Yi Wu <[email protected]>
1 parent 40c6c8b commit 8841014

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ update:
99
glide up
1010

1111
test:
12-
go test -v -cover .
12+
go test -v -cover -coverprofile=.cover/coverage.txt
1313

1414
html:
1515
go tool cover -html=.cover/coverage.txt

auth_jwt.go

+38-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ type GinJWTMiddleware struct {
5454

5555
// User can define own Unauthorized func.
5656
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
5766
}
5867

5968
// Login form structure.
@@ -65,6 +74,10 @@ type Login struct {
6574
// MiddlewareInit initialize jwt configs.
6675
func (mw *GinJWTMiddleware) MiddlewareInit() error {
6776

77+
if mw.TokenLookup == "" {
78+
mw.TokenLookup = "header:Authorization"
79+
}
80+
6881
if mw.SigningAlgorithm == "" {
6982
mw.SigningAlgorithm = "HS256"
7083
}
@@ -267,19 +280,40 @@ func (mw *GinJWTMiddleware) TokenGenerator(userID string) string {
267280
return tokenString
268281
}
269282

270-
func (mw *GinJWTMiddleware) parseToken(c *gin.Context) (*jwt.Token, error) {
283+
func (mw *GinJWTMiddleware) jwtFromHeader(c *gin.Context, key string) (string, error) {
271284
authHeader := c.Request.Header.Get("Authorization")
272285

273286
if authHeader == "" {
274-
return nil, errors.New("auth header empty")
287+
return "", errors.New("auth header empty")
275288
}
276289

277290
parts := strings.SplitN(authHeader, " ", 2)
278291
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
280314
}
281315

282-
return jwt.Parse(parts[1], func(token *jwt.Token) (interface{}, error) {
316+
return jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
283317
if jwt.GetSigningMethod(mw.SigningAlgorithm) != token.Method {
284318
return nil, errors.New("invalid signing algorithm")
285319
}

auth_jwt_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,25 @@ func TestMissingTimeOut(t *testing.T) {
108108
assert.Equal(t, time.Hour, authMiddleware.Timeout)
109109
}
110110

111+
func TestMissingTokenLookup(t *testing.T) {
112+
113+
authMiddleware := &GinJWTMiddleware{
114+
Realm: "test zone",
115+
Key: key,
116+
Authenticator: func(userId string, password string, c *gin.Context) (string, bool) {
117+
if userId == "admin" && password == "admin" {
118+
return "", true
119+
}
120+
121+
return "", false
122+
},
123+
}
124+
125+
authMiddleware.MiddlewareInit()
126+
127+
assert.Equal(t, "header:Authorization", authMiddleware.TokenLookup)
128+
}
129+
111130
func helloHandler(c *gin.Context) {
112131
c.JSON(200, gin.H{
113132
"text": "Hello World.",

0 commit comments

Comments
 (0)