fwh_login.go 3.6 KB

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