authorize_mechanism_by_appkey.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package middleware
  2. import (
  3. "fmt"
  4. "net/url"
  5. "sort"
  6. "strings"
  7. "surveyService/response"
  8. "surveyService/util"
  9. "surveyService/util/constants"
  10. "github.com/gin-gonic/gin"
  11. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk"
  12. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk/mechanism"
  13. )
  14. func AuthorizeMechanismByAppKey() gin.HandlerFunc {
  15. return func(c *gin.Context) {
  16. appKey := c.Request.Header.Get("appkey")
  17. if appKey == "" {
  18. response.Fail(c, response.ErrInvalidToken)
  19. return
  20. }
  21. sign := c.Request.Header.Get("sign")
  22. if sign == "" {
  23. response.Fail(c, response.ErrSign)
  24. return
  25. }
  26. var currentUser *sdk.AuthMechanism
  27. var err *response.ErrCode
  28. // 拿到用户系统的资料
  29. detailResponse, findErr := mechanism.DetailByAppKey(appKey)
  30. if findErr != nil {
  31. response.Fail(c, &response.ErrCode{
  32. Code: response.INVALID_TOKEN,
  33. Msg: findErr.Msg,
  34. })
  35. return
  36. }
  37. currentUser = &sdk.AuthMechanism{
  38. ID: detailResponse.Data.Detail.ID,
  39. Nickname: detailResponse.Data.Detail.Nickname,
  40. Account: detailResponse.Data.Detail.Account,
  41. LoginAt: 0,
  42. IsMechanism: true,
  43. FullPermission: false,
  44. Permissions: detailResponse.Data.Detail.Permissions,
  45. Mechanism: &sdk.AuthBaseMechanism{
  46. ID: detailResponse.Data.Detail.ID,
  47. Nickname: detailResponse.Data.Detail.Nickname,
  48. Account: detailResponse.Data.Detail.Account,
  49. RawId: detailResponse.Data.Detail.RawId,
  50. AppKey: detailResponse.Data.Detail.AppKey,
  51. AppSecret: detailResponse.Data.Detail.AppSecret,
  52. IpWhiteList: detailResponse.Data.Detail.IpWhiteList,
  53. CallbackUrlList: detailResponse.Data.Detail.CallbackUrlList,
  54. },
  55. }
  56. if err != nil {
  57. response.Fail(c, err)
  58. return
  59. }
  60. // 校验签名
  61. requestData := util.GetRequestJsonData(c)
  62. makedSign := makeSign(requestData, currentUser.Mechanism.AppSecret)
  63. // fmt.Println(makedSign, sign)
  64. if makedSign != sign {
  65. response.Fail(c, response.ErrSign)
  66. return
  67. }
  68. c.Set(constants.MechanismOpenAPICacheKey, currentUser)
  69. c.Next()
  70. }
  71. }
  72. func makeSign(requestData map[string]any, appSecret string) string {
  73. // 将map的key存储到一个切片中
  74. keys := make([]string, 0, len(requestData))
  75. for k := range requestData {
  76. keys = append(keys, k)
  77. }
  78. // 对切片进行排序
  79. sort.Strings(keys)
  80. // 将请求参数按照key的升序排列
  81. var requestDataArray []string = make([]string, 0)
  82. // 遍历排序后的切片,并使用map的key来访问map中的值
  83. for _, k := range keys {
  84. v := requestData[k]
  85. requestDataArray = append(requestDataArray, k+"="+url.QueryEscape(fmt.Sprint(v)))
  86. }
  87. // 拼接成key1=value1&key2=value2&key3=value3的形式
  88. requestDataString := strings.Join(requestDataArray, "&")
  89. // fmt.Println("拼装后字段", requestDataString)
  90. // 将appSecret拼接到最后
  91. signString := requestDataString + appSecret
  92. // fmt.Println("待签名字段", signString)
  93. // 计算md5
  94. sign := strings.ToUpper(util.Md5(signString))
  95. // fmt.Println("签名: ", sign)
  96. return sign
  97. }