sign.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package middleware
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/md5"
  5. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/resp"
  6. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  7. "github.com/spf13/viper"
  8. "net/http"
  9. "sort"
  10. "strings"
  11. )
  12. func SignMiddleware(logger *log.Logger, conf *viper.Viper) gin.HandlerFunc {
  13. return func(ctx *gin.Context) {
  14. requiredHeaders := []string{"Timestamp", "Nonce", "Sign", "App-Version"}
  15. for _, header := range requiredHeaders {
  16. value, ok := ctx.Request.Header[header]
  17. if !ok || len(value) == 0 {
  18. resp.HandleError(ctx, http.StatusBadRequest, 1, "sign error.", nil)
  19. ctx.Abort()
  20. return
  21. }
  22. }
  23. data := map[string]string{
  24. "AppKey": conf.GetString("security.api_sign.app_key"),
  25. "Timestamp": ctx.Request.Header.Get("Timestamp"),
  26. "Nonce": ctx.Request.Header.Get("Nonce"),
  27. "AppVersion": ctx.Request.Header.Get("App-Version"),
  28. }
  29. var keys []string
  30. for k := range data {
  31. keys = append(keys, k)
  32. }
  33. sort.Slice(keys, func(i, j int) bool { return strings.ToLower(keys[i]) < strings.ToLower(keys[j]) })
  34. var str string
  35. for _, k := range keys {
  36. str += k + data[k]
  37. }
  38. str += conf.GetString("security.api_sign.app_security")
  39. if ctx.Request.Header.Get("Sign") != strings.ToUpper(md5.Md5(str)) {
  40. resp.HandleError(ctx, http.StatusBadRequest, 1, "sign error.", nil)
  41. ctx.Abort()
  42. return
  43. }
  44. ctx.Next()
  45. }
  46. }