github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sign/accesskey_merchant.go (about) 1 package sign 2 3 import ( 4 "github.com/artisanhe/tools/httplib" 5 "github.com/gin-gonic/gin" 6 ) 7 8 func getAccessKeyIdentifier() string { 9 return AccessKey 10 } 11 12 type AccessKeyer interface { 13 GetMerchantBy(string) (interface{}, error) 14 GetSecret(interface{}) string 15 } 16 17 type AccessKeyParam struct { 18 // AccessKey 19 AccessKey string `json:"AccessKey" in:"header"` 20 } 21 22 func fetchMerchantAndStore(accessKeyer AccessKeyer, c *gin.Context) (interface{}, error) { 23 req := AccessKeyParam{} 24 err := httplib.TransToReq(c, &req) 25 if err != nil { 26 return nil, err 27 } 28 29 resp, err := accessKeyer.GetMerchantBy(req.AccessKey) 30 if err != nil { 31 return nil, err 32 } 33 34 c.Set(getAccessKeyIdentifier(), resp) 35 return resp, nil 36 } 37 38 func FetchMerchant(accessKeyer AccessKeyer) gin.HandlerFunc { 39 return func(c *gin.Context) { 40 if _, err := fetchMerchantAndStore(accessKeyer, c); err != nil { 41 httplib.WriteError(c, err) 42 c.Abort() 43 return 44 } 45 46 return 47 } 48 } 49 50 func GetMerchantFromContext(c *gin.Context) (interface{}, bool) { 51 return c.Get(getAccessKeyIdentifier()) 52 } 53 54 func VerifySign(accessKeyer AccessKeyer) gin.HandlerFunc { 55 return func(c *gin.Context) { 56 var err error 57 merchant, exist := GetMerchantFromContext(c) 58 if !exist { 59 merchant, err = fetchMerchantAndStore(accessKeyer, c) 60 if err != nil { 61 httplib.WriteError(c, err) 62 c.Abort() 63 return 64 } 65 } 66 67 keyFunc := func(key string) (string, error) { 68 return accessKeyer.GetSecret(merchant), nil 69 } 70 71 WithSignBy(keyFunc)(c) 72 } 73 }