auth/jwt/payload.go
2025-01-11 00:42:32 +03:00

77 lines
1.8 KiB
Go

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)
}