fwh_login.go 3.8 KB

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