package jwt import ( "encoding/base64" "encoding/hex" "time" "github.com/gofrs/uuid" ) type Option func(*Token) // WithIssuer устанавливает идентификатор принципала, выдавшего JWT (string, URL) func WithIssuer(iss string) Option { return func(t *Token) { t.Payload.AppendArg("iss", iss) } } // WithSubject устанавливает идентификатор принципала, который является предметом JWT (string, URL) func WithSubject(sub string) Option { return func(t *Token) { t.Payload.AppendArg("sub", sub) } } // WithAudience устанавливает идентификатор получателей, для которых предназначен JWT func WithAudience(aud ...string) Option { return func(t *Token) { if len(aud) == 1 { t.Payload.AppendArg("aud", aud[0]) return } t.Payload.AppendArg("aud", aud) } } // WithExpirationTime устанавливает время истечения срока действия, по истечении которого JWT НЕ ДОЛЖЕН быть принят к обработке func WithExpirationTime(exp time.Time) Option { return func(t *Token) { t.Payload.AppendArg("exp", exp.Unix()) } } // WithNotBefore устанавливает время, до которого JWT НЕ ДОЛЖЕН быть принят к обработке func WithNotBefore(nbf time.Time) Option { return func(t *Token) { t.Payload.AppendArg("nbf", nbf.Unix()) } } // WithIssuedAt устанавливает время, когда был создан JWT func WithIssuedAt(iat time.Time) Option { return func(t *Token) { t.Payload.AppendArg("iat", iat.Unix()) } } // WithIssuedAtNow устанавливает текущее время создания JWT func WithIssuedAtNow() Option { return func(t *Token) { t.Payload.AppendArg("iat", time.Now()) } } // WithIssuedAt устанавливает уникальный идентификатор для JWT func WithJwtId(jti string) Option { return func(t *Token) { t.Payload.AppendArg("jti", jti) } } // WithGenJwtId генерирует уникальный идентификатор для JWT (uuid v7) func WithGenJwtId() Option { return func(t *Token) { jti := hex.EncodeToString([]byte(time.Now().String())) if val, err := uuid.NewV7(); err == nil { jti = val.String() } t.Payload.AppendArg("jti", jti) } } // WithHeaderKeyId устанавливает в заголовке параметр kid func WithHeaderKeyId(kid []byte) Option { return func(t *Token) { t.Header.AppendArg("kid", base64.RawURLEncoding.EncodeToString(kid)) } } type VerifyOption func(*Token) error // WithVerifyIssuer проверяет существуют ли заданные владельцы func WithVerifyIssuer(iss ...string) VerifyOption { return func(t *Token) error { val, err := t.Payload.GetIssuer() if err != nil { return err } if len(iss) == 0 { return nil } for _, v := range iss { if v == val { return nil } } return Err_1 } } func WithVerifyAudience(aud ...string) VerifyOption { return func(t *Token) error { val, err := t.Payload.GetAudience() if err != nil { return err } if len(aud) == 0 { return nil } for _, a := range aud { for _, v := range val { if a == v { return nil } } } return Err_2 } }