-
Notifications
You must be signed in to change notification settings - Fork 20
/
builder.go
80 lines (69 loc) · 1.85 KB
/
builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package jwt
import (
"container/list"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"github.com/go-masonry/mortar/interfaces/auth/jwt"
)
// JSONDecoder json.Unmarshaler
type JSONDecoder func(data []byte, v interface{}) error
// ExtractorBuilder defines what can be configured when building JWT Token Extractor
type ExtractorBuilder interface {
SetDecoder(dec JSONDecoder) ExtractorBuilder
SetContextExtractor(extractor jwt.ContextExtractor) ExtractorBuilder
SetBase64Decoder(dec *base64.Encoding) ExtractorBuilder
Build() jwt.TokenExtractor
}
type extractorConfig struct {
jsonDecoder JSONDecoder
base64Enc *base64.Encoding
contextExtractor jwt.ContextExtractor
}
type builder struct {
ll *list.List
}
// Builder creates a fresh instance of Extractor Builder
func Builder() ExtractorBuilder {
return &builder{
ll: list.New(),
}
}
func (b *builder) SetDecoder(dec JSONDecoder) ExtractorBuilder {
b.ll.PushBack(func(cfg *extractorConfig) {
cfg.jsonDecoder = dec
})
return b
}
func (b *builder) SetContextExtractor(extractor jwt.ContextExtractor) ExtractorBuilder {
b.ll.PushBack(func(cfg *extractorConfig) {
cfg.contextExtractor = extractor
})
return b
}
func (b *builder) SetBase64Decoder(dec *base64.Encoding) ExtractorBuilder {
b.ll.PushBack(func(cfg *extractorConfig) {
cfg.base64Enc = dec
})
return b
}
func (b *builder) Build() jwt.TokenExtractor {
var cfg = new(extractorConfig)
for e := b.ll.Front(); e != nil; e = e.Next() {
f := e.Value.(func(config *extractorConfig))
f(cfg)
}
if cfg.base64Enc == nil {
cfg.base64Enc = base64.RawURLEncoding
}
if cfg.jsonDecoder == nil {
cfg.jsonDecoder = json.Unmarshal
}
if cfg.contextExtractor == nil {
cfg.contextExtractor = func(ctx context.Context) (string, error) {
return "", fmt.Errorf("no context extractor provided")
}
}
return newTokenExtractor(cfg)
}