package wb import ( "encoding/json" "fmt" "github.com/golang-jwt/jwt/v5" "net/http" "sipro-mps/internal/marketplace" wbclient "sipro-mps/pkg/api/wb/client" "time" ) type WbAuthData struct { Token string `json:"token"` } func NewWbAuthData(token string) WbAuthData { return WbAuthData{ Token: token, } } func DecodeWildberriesJwt(token []byte) (WbAuthData, jwt.MapClaims, error) { var authData WbAuthData err := json.Unmarshal(token, &authData) if err != nil { return authData, nil, fmt.Errorf("failed to unmarshal JWT: %w", err) } claims := jwt.MapClaims{} _, _, err = jwt.NewParser().ParseUnverified(authData.Token, claims) if err != nil { return authData, nil, fmt.Errorf("invalid JWT: %w", err) } return authData, claims, nil } func GetClientFromMarketplace(mp *marketplace.Marketplace) (*wbclient.Client, error) { authData, claims, err := DecodeWildberriesJwt(mp.AuthDataJson) if err != nil { return nil, fmt.Errorf("failed to decode Wildberries JWT") } exp := claims["exp"].(float64) // chec if token is expired, for now unix date now := float64(time.Now().Unix()) if exp < now { return nil, fmt.Errorf("token is expired") } securityHandler := NewWildberriesSecurityHandler(authData.Token) httpClient := &http.Client{ Transport: NewRateLimitTransport(), } client, err := wbclient.NewClient("https://content-api.wildberries.ru", securityHandler, wbclient.WithClient(httpClient)) if err != nil { return nil, fmt.Errorf("failed to create Wildberries client: %w", err) } return client, nil }