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) } } // WithNotBefore устанавливает время, до которого JWT НЕ ДОЛЖЕН быть принят к обработке func WithNotBefore(nbf time.Time) Option { return func(t *Token) { t.Payload.AppendArg("nbf", nbf) } } // WithIssuedAt устанавливает время, когда был создан JWT func WithIssuedAt(iat time.Time) Option { return func(t *Token) { t.Payload.AppendArg("iat", iat) } } // 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)) } }