| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- package fwh_pro
- import (
- "bytes"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "strings"
- "time"
- )
- 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: "FMH001",
- Password: "cfd9d803fafcf2c7a832bfba5d039512",
- Type: 1,
- Lang: "ZH_CN",
- }
- jsonData, _ := json.Marshal(payload)
- // 创建请求
- req, err := http.NewRequest(
- http.MethodPost,
- "https://oss.franklinwh.com/api-user/user/login",
- bytes.NewBuffer(jsonData))
- if err != nil {
- fmt.Println(err.Error())
- return err
- }
- // 设置 Content-Type 和 Authorization
- req.Header.Set("Content-Type", "application/json")
- // 发送请求
- client := &http.Client{Timeout: 5 * time.Second}
- resp, err := client.Do(req)
- if err != nil {
- fmt.Println(err.Error())
- return err
- }
- defer resp.Body.Close()
- body, _ := io.ReadAll(resp.Body)
- // fmt.Printf("Status: %s\nBody: %s", resp.Status, body)
- var loginRes LoginResponse
- // 反序列化(unmarshal)
- jsonErr := json.Unmarshal(body, &loginRes)
- if jsonErr != nil {
- return jsonErr
- }
- loginInfo.UserId = loginRes.Data.UserId
- loginInfo.Token = loginRes.Data.Token
- return nil
- }
- 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 {
- 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是否过期
- expired, err := isTokenExpired(loginInfo.Token)
- if err != nil {
- fmt.Println("loginInfo.Token 解析出错:", err)
- return ""
- }
- if expired {
- fmt.Println("Token 已过期")
- } else {
- // fmt.Println("Token 有效")
- return loginInfo.Token
- }
- }
- // 重新登录
- Login()
- return loginInfo.Token
- }
- 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
- }
- // 清空token
- func ClearToken() {
- loginInfo.UserId = 0
- loginInfo.Token = ""
- }
|