139 lines
3.4 KiB
Go
139 lines
3.4 KiB
Go
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
|
||
}
|
||
}
|