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  }