fwh_login.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package fwh_pro
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "strings"
  10. "time"
  11. "go.uber.org/zap"
  12. )
  13. var loginInfo LoginData = LoginData{
  14. UserId: 0,
  15. Token: "",
  16. }
  17. type LoginPayload struct {
  18. LoginName string `json:"loginName"`
  19. Password string `json:"password"`
  20. Type int `json:"type"`
  21. Lang string `json:"lang"`
  22. }
  23. type LoginData struct {
  24. UserId uint `json:"userId"`
  25. Token string `json:"token"`
  26. }
  27. type LoginResponse struct {
  28. Code int `json:"code"`
  29. Msg string `json:"msg"`
  30. Data LoginData `json:"data"`
  31. Success bool `json:"success"`
  32. }
  33. type JwtPayload struct {
  34. AdminLevel int `json:"adminLevel"`
  35. LoginName string `json:"loginName"`
  36. AccountType int `json:"accountType"`
  37. GroupId int `json:"groupId"`
  38. Iss string `json:"iss"`
  39. UserManage int `json:"userManage"`
  40. Exp uint64 `json:"exp"`
  41. UserName string `json:"userName"`
  42. Iat uint64 `json:"iat"`
  43. UserId int `json:"userId"`
  44. }
  45. func Login() error {
  46. // 要发送的 JSON
  47. payload := LoginPayload{
  48. LoginName: "FMH001",
  49. Password: "cfd9d803fafcf2c7a832bfba5d039512",
  50. Type: 1,
  51. Lang: "ZH_CN",
  52. }
  53. jsonData, _ := json.Marshal(payload)
  54. // 创建请求
  55. req, err := http.NewRequest(
  56. http.MethodPost,
  57. "https://oss.franklinwh.com/api-user/user/login",
  58. bytes.NewBuffer(jsonData))
  59. if err != nil {
  60. zap.L().Error("NewRequest failed.", zap.String("err", err.Error()))
  61. return err
  62. }
  63. // 设置 Content-Type 和 Authorization
  64. req.Header.Set("Content-Type", "application/json")
  65. // 发送请求
  66. client := &http.Client{Timeout: 5 * time.Second}
  67. resp, err := client.Do(req)
  68. if err != nil {
  69. zap.L().Error("Do Send failed.", zap.String("err", err.Error()))
  70. return err
  71. }
  72. defer resp.Body.Close()
  73. body, _ := io.ReadAll(resp.Body)
  74. // logger.Std.Printf("Status: %s\nBody: %s", resp.Status, body)
  75. var loginRes LoginResponse
  76. // 反序列化(unmarshal)
  77. jsonErr := json.Unmarshal(body, &loginRes)
  78. if jsonErr != nil {
  79. return jsonErr
  80. }
  81. loginInfo.UserId = loginRes.Data.UserId
  82. loginInfo.Token = loginRes.Data.Token
  83. return nil
  84. }
  85. func isTokenExpired(token string) (bool, error) {
  86. parts := strings.Split(token, ".")
  87. if len(parts) != 3 {
  88. return false, fmt.Errorf("token 格式错误")
  89. }
  90. payloadSegment := parts[1]
  91. // JWT 使用 base64 URL encoding
  92. payloadBytes, err := base64.RawURLEncoding.DecodeString(payloadSegment)
  93. if err != nil {
  94. return false, err
  95. }
  96. var payload map[string]interface{}
  97. if err := json.Unmarshal(payloadBytes, &payload); err != nil {
  98. return false, err
  99. }
  100. expFloat, ok := payload["exp"].(float64)
  101. if !ok {
  102. return false, fmt.Errorf("token payload 中没有 exp")
  103. }
  104. expTime := time.Unix(int64(expFloat), 0)
  105. return time.Now().After(expTime), nil
  106. }
  107. func getLoginToken() string {
  108. // 判断是否已经有token
  109. if loginInfo.Token != "" {
  110. // 判断token是否过期
  111. expired, err := isTokenExpired(loginInfo.Token)
  112. if err != nil {
  113. zap.L().Error("loginInfo.Token 解析出错.", zap.String("err", err.Error()))
  114. return ""
  115. }
  116. if expired {
  117. zap.L().Info("fwh Token 已过期")
  118. } else {
  119. // Token 有效
  120. return loginInfo.Token
  121. }
  122. }
  123. // 重新登录
  124. Login()
  125. return loginInfo.Token
  126. }
  127. func getUserId(token string) (int, error) {
  128. // JWT 由三部分组成: header.payload.signature
  129. parts := strings.Split(token, ".")
  130. if len(parts) < 2 {
  131. return 0, fmt.Errorf("getUserId: invalid token")
  132. }
  133. // 解码 payload 部分
  134. payload, err := base64.RawURLEncoding.DecodeString(parts[1])
  135. if err != nil {
  136. return 0, fmt.Errorf("getUserId: %s", err.Error())
  137. }
  138. // 解析 JSON
  139. var claims JwtPayload
  140. if err := json.Unmarshal(payload, &claims); err != nil {
  141. return 0, fmt.Errorf("getUserId: %s", err.Error())
  142. }
  143. return claims.UserId, nil
  144. }
  145. // 清空token
  146. func ClearToken() {
  147. loginInfo.UserId = 0
  148. loginInfo.Token = ""
  149. }