| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package fwh_pro
- import (
- "encoding/json"
- "fmt"
- "fwh-toolbox-server/config"
- )
- var loginInfo LoginData = LoginData{
- UserId: 0,
- Token: "",
- }
- type LoginPayload struct {
- LoginName string `json:"loginName"`
- Password string `json:"password"`
- Type int `json:"type"`
- Lang string `json:"lang"`
- }
- type LoginData struct {
- UserId uint `json:"userId"`
- Token string `json:"token"`
- }
- type LoginResponse struct {
- Code int `json:"code"`
- Msg string `json:"msg"`
- Data LoginData `json:"data"`
- Success bool `json:"success"`
- }
- type JwtPayload struct {
- AdminLevel int `json:"adminLevel"`
- LoginName string `json:"loginName"`
- AccountType int `json:"accountType"`
- GroupId int `json:"groupId"`
- Iss string `json:"iss"`
- UserManage int `json:"userManage"`
- Exp uint64 `json:"exp"`
- UserName string `json:"userName"`
- Iat uint64 `json:"iat"`
- UserId int `json:"userId"`
- }
- func Login() error {
- // 要发送的 JSON
- payload := LoginPayload{
- LoginName: config.FWH_USER,
- Password: config.FWH_PASSWORD,
- Type: 1,
- Lang: "ZH_CN",
- }
- url := fmt.Sprintf("https://%s/api-user/user/login", config.FWH_OSS)
- response, err := FwhHttpPostWithoutToken(url, payload)
- if err != nil {
- return err
- }
- // logger.Std.Printf("Status: %s\nBody: %s", resp.Status, body)
- var loginRes LoginResponse
- // 反序列化(unmarshal)
- jsonErr := json.Unmarshal(response.Body, &loginRes)
- if jsonErr != nil {
- return jsonErr
- }
- loginInfo.UserId = loginRes.Data.UserId
- loginInfo.Token = loginRes.Data.Token
- return nil
- }
- // 弃用:token payload被加密
- // func isTokenExpired(token string) (bool, error) {
- // parts := strings.Split(token, ".")
- // if len(parts) != 3 {
- // return false, fmt.Errorf("token 格式错误")
- // }
- // payloadSegment := parts[1]
- // // JWT 使用 base64 URL encoding
- // payloadBytes, err := base64.RawURLEncoding.DecodeString(payloadSegment)
- // if err != nil {
- // return false, err
- // }
- // var payload map[string]interface{}
- // if err := json.Unmarshal(payloadBytes, &payload); err != nil {
- // zap.L().Error("token payload解析失败", zap.String("payload", string(payloadBytes)))
- // return false, err
- // }
- // expFloat, ok := payload["exp"].(float64)
- // if !ok {
- // return false, fmt.Errorf("token payload 中没有 exp")
- // }
- // expTime := time.Unix(int64(expFloat), 0)
- // return time.Now().After(expTime), nil
- // }
- func getLoginToken() string {
- // 判断是否已经有token
- if loginInfo.Token != "" {
- // 判断token是否过期
- // token.payload加密,无法判断过期,改为判断401
- // expired, err := isTokenExpired(loginInfo.Token)
- // if err != nil {
- // zap.L().Error("loginInfo.Token 解析出错.", zap.String("token", loginInfo.Token), zap.String("err", err.Error()))
- // return ""
- // }
- // if expired {
- // zap.L().Info("fwh Token 已过期")
- // } else {
- // Token 有效
- return loginInfo.Token
- // }
- }
- // 重新登录
- Login()
- return loginInfo.Token
- }
- // 弃用:token payload被加密
- // func getUserId(token string) (int, error) {
- // // JWT 由三部分组成: header.payload.signature
- // parts := strings.Split(token, ".")
- // if len(parts) < 2 {
- // return 0, fmt.Errorf("getUserId: invalid token")
- // }
- // // 解码 payload 部分
- // payload, err := base64.RawURLEncoding.DecodeString(parts[1])
- // if err != nil {
- // return 0, fmt.Errorf("getUserId: %s", err.Error())
- // }
- // // 解析 JSON
- // var claims JwtPayload
- // if err := json.Unmarshal(payload, &claims); err != nil {
- // return 0, fmt.Errorf("getUserId: %s", err.Error())
- // }
- // return claims.UserId, nil
- // }
- func getUserId() uint {
- return loginInfo.UserId
- }
- // 清空token
- func ClearToken() {
- loginInfo.UserId = 0
- loginInfo.Token = ""
- }
- // 过期重新登录 - 提供给httpClient
- func reLogin() string {
- // 重新登录
- Login()
- return loginInfo.Token
- }
|