See More

/*ModuleAB common/auth.go -- define auth algorithm * Copyright (C) 2016 TonyChyi * License: GPL v3 or later. */ package common import ( "crypto/hmac" "crypto/sha1" "encoding/base64" "fmt" "time" "github.com/astaxie/beego" "github.com/astaxie/beego/context" ) //AuthExpireDuration is 10 minutes const AuthExpireDuration = 10 * time.Minute //Auth whether http request is valid. func AuthWithKey(ctx *context.Context) error { key := beego.AppConfig.String("loginkey") sTime := ctx.Input.Header("Date") pTime, err := time.Parse(time.RFC1123, sTime) if err != nil { return err } if time.Now().UTC().Sub(pTime) > AuthExpireDuration || time.Now().UTC().Sub(pTime) < -AuthExpireDuration { return fmt.Errorf("Client time is out of server time") } sign := ctx.Input.Header("Signature") h := hmac.New(sha1.New, []byte(key)) beego.Debug("Got URL:", ctx.Input.URL()) beego.Debug("Got date:", sTime) h.Write( []byte( fmt.Sprintf( "%s%s", sTime, ctx.Input.URL(), ), ), ) b := base64.StdEncoding.EncodeToString(h.Sum(nil)) if sign != b { return fmt.Errorf("Bad signature.") } return nil }