劲创营---任务项目
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

186 líneas
5.2 KiB

  1. package utils
  2. import (
  3. "applet/app/cfg"
  4. "applet/app/comm/utils/cache"
  5. "applet/app/comm/utils/logx"
  6. "fmt"
  7. "github.com/forgoer/openssl"
  8. "github.com/gin-gonic/gin"
  9. "github.com/syyongx/php2go"
  10. "strings"
  11. "time"
  12. )
  13. var publicKey = []byte(`-----BEGIN PUBLIC KEY-----
  14. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFQD7RL2tDNuwdg0jTfV0zjAzh
  15. WoCWfGrcNiucy2XUHZZU2oGhHv1N10qu3XayTDD4pu4sJ73biKwqR6ZN7IS4Sfon
  16. vrzaXGvrTG4kmdo3XrbrkzmyBHDLTsJvv6pyS2HPl9QPSvKDN0iJ66+KN8QjBpw1
  17. FNIGe7xbDaJPY733/QIDAQAB
  18. -----END PUBLIC KEY-----`)
  19. var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
  20. MIICXAIBAAKBgQCFQD7RL2tDNuwdg0jTfV0zjAzhWoCWfGrcNiucy2XUHZZU2oGh
  21. Hv1N10qu3XayTDD4pu4sJ73biKwqR6ZN7IS4SfonvrzaXGvrTG4kmdo3Xrbrkzmy
  22. BHDLTsJvv6pyS2HPl9QPSvKDN0iJ66+KN8QjBpw1FNIGe7xbDaJPY733/QIDAQAB
  23. AoGADi14wY8XDY7Bbp5yWDZFfV+QW0Xi2qAgSo/k8gjeK8R+I0cgdcEzWF3oz1Q2
  24. 9d+PclVokAAmfj47e0AmXLImqMCSEzi1jDBUFIRoJk9WE1YstE94mrCgV0FW+N/u
  25. +L6OgZcjmF+9dHKprnpaUGQuUV5fF8j0qp8S2Jfs3Sw+dOECQQCQnHALzFjmXXIR
  26. Ez3VSK4ZoYgDIrrpzNst5Hh6AMDNZcG3CrCxlQrgqjgTzBSr3ZSavvkfYRj42STk
  27. TqyX1tQFAkEA6+O6UENoUTk2lG7iO/ta7cdIULnkTGwQqvkgLIUjk6w8E3sBTIfw
  28. rerTEmquw5F42HHE+FMrRat06ZN57lENmQJAYgUHlZevcoZIePZ35Qfcqpbo4Gc8
  29. Fpm6vwKr/tZf2Vlt0qo2VkhWFS6L0C92m4AX6EQmDHT+Pj7BWNdS+aCuGQJBAOkq
  30. NKPZvWdr8jNOV3mKvxqB/U0uMigIOYGGtvLKt5vkh42J7ILFbHW8w95UbWMKjDUG
  31. X/hF3WQEUo//Imsa2yECQHSZIpJxiTRueoDiyRt0LH+jdbYFUu/6D0UIYXhFvP/p
  32. EZX+hfCfUnNYX59UVpRjSZ66g0CbCjuBPOhmOD+hDeQ=
  33. -----END RSA PRIVATE KEY-----`)
  34. func GetApiVersion(c *gin.Context) int {
  35. var apiVersion = c.GetHeader("apiVersion")
  36. if StrToInt(apiVersion) == 0 { //没有版本号先不校验
  37. apiVersion = c.GetHeader("Apiversion")
  38. }
  39. if StrToInt(apiVersion) == 0 { //没有版本号先不校验
  40. apiVersion = c.GetHeader("api_version")
  41. }
  42. if cfg.Prd && c.GetString("api_version") == "1" {
  43. apiVersion = "1"
  44. }
  45. var uri = c.Request.RequestURI
  46. if InArr(c.GetHeader("platform"), []string{"ios", "android"}) { //不用签名的接口
  47. var filterList = []string{
  48. "/api/v1/comm/taskCenter/index",
  49. }
  50. for _, v := range filterList {
  51. if strings.Contains(uri, v) {
  52. apiVersion = "0"
  53. }
  54. }
  55. }
  56. return StrToInt(apiVersion)
  57. }
  58. func CheckUri(c *gin.Context) int {
  59. apiVersion := "1"
  60. //var uri = c.Request.RequestURI
  61. if InArr(c.GetHeader("platform"), []string{"ios", "android"}) { //不用签名的接口
  62. //var filterList = []string{
  63. // "/api/v1/appcheck",
  64. // "/api/v1/app/guide",
  65. // "/api/v1/new/config.json",
  66. // "api/v1/rec",
  67. // "api/v1/custom/mod/",
  68. // "api/v1/mod/",
  69. // "api/v1/s/",
  70. //}
  71. //for _, v := range filterList {
  72. // if strings.Contains(uri, v) {
  73. // apiVersion = "0"
  74. // }
  75. //}
  76. apiVersion = "0"
  77. }
  78. return StrToInt(apiVersion)
  79. }
  80. // 签名校验
  81. func SignCheck(c *gin.Context) bool {
  82. var apiVersion = GetApiVersion(c)
  83. if apiVersion == 0 { //没有版本号先不校验
  84. return true
  85. }
  86. //1.通过rsa 解析出 aes
  87. var key = c.GetHeader("key")
  88. //拼接对应参数
  89. var uri = c.Request.RequestURI
  90. var query = GetQueryParam(uri)
  91. fmt.Println(query)
  92. query["timestamp"] = c.GetHeader("timestamp")
  93. query["nonce"] = c.GetHeader("nonce")
  94. query["key"] = key
  95. token := c.GetHeader("Authorization")
  96. if token != "" {
  97. // 按空格分割
  98. parts := strings.SplitN(token, " ", 2)
  99. if len(parts) == 2 && parts[0] == "Bearer" {
  100. token = parts[1]
  101. }
  102. }
  103. query["token"] = token
  104. //2.query参数按照 ASCII 码从小到大排序
  105. str := JoinStringsInASCII(query, "&", false, false, "")
  106. //3.拼上密钥
  107. secret := ""
  108. if InArr(c.GetHeader("platform"), []string{"android", "ios"}) {
  109. secret = c.GetString("app_api_secret_key")
  110. } else if c.GetHeader("platform") == "wap" {
  111. secret = c.GetString("h5_api_secret_key")
  112. } else {
  113. secret = c.GetString("applet_api_secret_key")
  114. }
  115. str = fmt.Sprintf("%s&secret=%s", str, secret)
  116. fmt.Println(str)
  117. //4.md5加密 转小写
  118. sign := strings.ToLower(Md5(str))
  119. //5.判断跟前端传来的sign是否一致
  120. if sign != c.GetHeader("sign") {
  121. return false
  122. }
  123. if strings.Contains(c.Request.RequestURI, "save_task_count") {
  124. if StrToInt64(query["timestamp"])/1000 < time.Now().Unix()-300 {
  125. fmt.Println("============" + query["timestamp"])
  126. return false
  127. }
  128. if query["nonce"] != "" {
  129. //TODO s
  130. getString, err := cache.GetString("app.comm.sign.nonce." + query["nonce"])
  131. if err != nil {
  132. fmt.Println("nonce", err)
  133. }
  134. if getString != "" {
  135. fmt.Println("nonce", "============"+getString)
  136. return false
  137. } else {
  138. cache.SetEx(query["nonce"], "1", 300)
  139. }
  140. }
  141. }
  142. return true
  143. }
  144. func ResultAes(c *gin.Context, raw []byte) string {
  145. var key = c.GetHeader("key")
  146. base, _ := php2go.Base64Decode(key)
  147. aes, err := RsaDecrypt([]byte(base), privateKey)
  148. if err != nil {
  149. logx.Info(err)
  150. return ""
  151. }
  152. str, _ := openssl.AesECBEncrypt(raw, aes, openssl.PKCS7_PADDING)
  153. value := php2go.Base64Encode(string(str))
  154. fmt.Println(value)
  155. return value
  156. }
  157. func ResultAesDecrypt(c *gin.Context, raw string) string {
  158. var key = c.GetHeader("key")
  159. base, _ := php2go.Base64Decode(key)
  160. aes, err := RsaDecrypt([]byte(base), privateKey)
  161. if err != nil {
  162. logx.Info(err)
  163. return ""
  164. }
  165. raw = strings.ReplaceAll(raw, "\"", "")
  166. fmt.Println(raw)
  167. value1, _ := php2go.Base64Decode(raw)
  168. if value1 == "" {
  169. return ""
  170. }
  171. str1, _ := openssl.AesECBDecrypt([]byte(value1), aes, openssl.PKCS7_PADDING)
  172. return string(str1)
  173. }