fwh_login.go 3.7 KB

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