77 lines
1.8 KiB
Go
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)
|
|
}
|