package middleware import ( "fmt" "net/http" "git.links123.net/links123.com/skeleton/config" "github.com/dgrijalva/jwt-go" "github.com/wpajqz/linker" ) // headers const ( CtxRequestHeaderUserId = "user_id" CtxRequestHeaderAuthorization = "Authorization" ) // Auth empty struct for middleware interface type Auth struct{} // Handle middleware process func (a *Auth) Handle(ctx linker.Context) linker.Context { tk := ctx.GetRequestProperty(CtxRequestHeaderAuthorization) if len(tk) < 8 { ctx.Error(http.StatusUnauthorized, "Auth failed") } token, err := jwt.Parse(tk[7:], func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(config.C.App.Secret), nil }) if err != nil || !token.Valid { ctx.Error(http.StatusUnauthorized, "Auth failed") } ctx.Set(CtxRequestHeaderUserId, int(token.Claims.(jwt.MapClaims)[CtxRequestHeaderUserId].(float64))) return ctx }