github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/modules/auth/authentication.go (about) 1 package auth 2 3 import ( 4 "time" 5 6 "github.com/insionng/makross" 7 "github.com/insionng/makross/jwt" 8 ) 9 10 // AuthJwtMiddler (secret, exprires) makross.Handler 11 func AuthJwtMiddler(i ...interface{}) makross.Handler { 12 return func(self *makross.Context) error { 13 claims := jwt.GetMapClaims(self) 14 var secret string 15 var exprires time.Duration 16 17 if len(i) == 0 { 18 if signingKey, okay := jwt.DefaultJWTConfig.SigningKey.(string); okay { 19 secret = signingKey 20 } 21 exprires = jwt.DefaultJWTConfig.Expires 22 } else { 23 if len(i) == 1 { 24 if signingKey, okay := i[0].(string); okay { 25 secret = signingKey 26 } 27 exprires = jwt.DefaultJWTConfig.Expires 28 } 29 30 if len(i) >= 2 { 31 if signingKey, okay := i[0].(string); okay { 32 secret = signingKey 33 } 34 if exprirez, okay := i[1].(time.Duration); okay { 35 exprires = exprirez 36 } 37 } 38 } 39 40 if cexp, okay := claims["exp"].(float64); okay { 41 if len(secret) == 0 { 42 panic("The secret key not set of jwt!") 43 } 44 if exprires == 0 { 45 panic("The exprires time not set of jwt!") 46 } 47 exp := int64(cexp) 48 exptime := time.Unix(exp, 0).Sub(time.Now()) 49 if (exptime > 0) && (exptime < (exprires / 3)) { 50 claims["exp"] = time.Now().Add(exprires).Unix() 51 token := jwt.NewToken("HS256", claims) 52 tokenString, _ := token.SignedString([]byte(secret)) 53 self.Response.Header().Set(makross.HeaderAccessControlExposeHeaders, "Authorization") 54 self.Response.Header().Set("Authorization", jwt.Bearer+" "+tokenString) 55 self.Set(jwt.DefaultJWTConfig.ContextKey, token) 56 self.Set("TokenString", tokenString) 57 } 58 } else { 59 return self.Break(makross.StatusBadRequest, makross.ErrStatusBadRequest) 60 } 61 62 if err := self.Next(); err != nil { 63 return err 64 } 65 66 return nil 67 68 } 69 }