github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sign/gin.go (about)

     1  package sign
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	"github.com/gin-gonic/gin"
     9  
    10  	"github.com/artisanhe/tools/courier/status_error"
    11  	"github.com/artisanhe/tools/httplib"
    12  )
    13  
    14  func WithSignBy(exchangeSecret SecretExchanger) gin.HandlerFunc {
    15  	return func(c *gin.Context) {
    16  		req := SignParams{}
    17  		err := httplib.TransToReq(c, &req)
    18  		if err != nil {
    19  			httplib.WriteError(c, err)
    20  			c.Abort()
    21  			return
    22  		}
    23  
    24  		query := c.Request.URL.Query()
    25  
    26  		expectSign, origin, err := getSign(c.Request, query, exchangeSecret)
    27  		if err != nil {
    28  			httplib.WriteError(c, err)
    29  			c.Abort()
    30  			return
    31  		}
    32  
    33  		if req.Sign != string(expectSign) {
    34  			errForSign := status_error.SignFailed.StatusError().
    35  				WithDesc(fmt.Sprintf("Origin %s&secret=***, Sign:[%s], Expected:[%s]", bytes.Split(origin, []byte("secret"))[0], req.Sign, expectSign))
    36  			httplib.WriteError(c, errForSign)
    37  			c.Abort()
    38  			return
    39  		}
    40  	}
    41  }
    42  
    43  func ValidateSign(exchangeSecret SecretExchanger, request *http.Request, sign string) error {
    44  	query := request.URL.Query()
    45  
    46  	expectSign, origin, err := getSign(request, query, exchangeSecret)
    47  	if err != nil {
    48  		return err
    49  	}
    50  
    51  	if sign != string(expectSign) {
    52  		errForSign := status_error.SignFailed.StatusError().
    53  			WithDesc(fmt.Sprintf("Origin %s&secret=***, Sign:[%s], Expected:[%s]", bytes.Split(origin, []byte("secret"))[0], sign, expectSign))
    54  		return errForSign
    55  	}
    56  
    57  	return nil
    58  }