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  }