package jwt import ( "encoding/json" "math" "time" ) type Payload struct { *Map } // GetExpirationTime возвращает срок действия JWT func (p *Payload) GetExpirationTime() (time.Time, error) { return p.GetTime("exp") } // GetIssuedAt возвращает время создания JWT func (p *Payload) GetIssuedAt() (time.Time, error) { return p.GetTime("iat") } // GetNotBefore возвращает время начала действия JWT func (p *Payload) GetNotBefore() (time.Time, error) { return p.GetTime("nbf") } // GetIssuer возвращает идентификатор принципала, выдавшего JWT func (p *Payload) GetIssuer() (string, error) { var val string return val, p.Unmarshal("iss", &val) } // GetSubject возвращает идентификатор принципала, который является предметом JWT func (p *Payload) GetSubject() (string, error) { var val string return val, p.Unmarshal("sub", &val) } // GetAudience возвращает идентификатор получателей func (p *Payload) GetAudience() ([]string, error) { var val any if err := p.Unmarshal("aud", &val); err != nil { return nil, err } switch v := val.(type) { case string: return []string{v}, nil case []string: return v, nil } return nil, ErrKeyInvalidType } func (p *Payload) GetTime(key string) (time.Time, error) { var val json.Number if err := p.Unmarshal(key, &val); err != nil { return time.Time{}, err } num, err := val.Float64() if err != nil { return time.Time{}, err } round, frac := math.Modf(num) return time.Unix(int64(round), int64(frac*1e9)), nil } // GetAny получает значение из полезной нагрузки func (p *Payload) GetAny(key string) (any, error) { var val any return val, p.Unmarshal(key, &val) }