auth/jwt/option.go
shchva 876df38907 edit: jwt
add: VerifyOption
    edit: Verify
2025-01-11 01:31:09 +03:00

139 lines
3.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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