fwh_login.go 3.7 KB

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