-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconfig.go
130 lines (113 loc) · 2.99 KB
/
config.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package openidauth
import (
"errors"
"fmt"
"github.com/emanoelxavier/openid2go/openid"
"github.com/mholt/caddy"
"github.com/mholt/caddy/caddyhttp/httpserver"
)
type auth struct {
Configuration *openid.Configuration
Paths []string
Next httpserver.Handler
}
func init() {
caddy.RegisterPlugin("openidauth", caddy.Plugin{
ServerType: "http",
Action: Setup,
})
}
// Setup sets up the middleware
func Setup(c *caddy.Controller) error {
issuer, clientIds, paths, err := parse(c)
if err != nil {
return err
}
c.OnStartup(func() error {
fmt.Println("Initiating OpenID Connect autentication middleware")
return nil
})
configuration, err := openid.NewConfiguration(openid.ProvidersGetter(getProviderFunc(issuer, clientIds)),
openid.ErrorHandler(onAuthenticateFailed))
if err != nil {
panic(err)
}
httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
return &auth{
Configuration: configuration,
Paths: paths,
Next: next,
}
})
fmt.Println("OpenID Connect autentication middleware successfully initiated")
return nil
}
func parseSingleValue(c *caddy.Controller) (string, error) {
if !c.NextArg() {
// we are expecting a value
return "", c.ArgErr()
}
r := c.Val()
if c.NextArg() {
// we are expecting only one value.
return "", c.ArgErr()
}
return r, nil
}
func parse(c *caddy.Controller) (issuer string, clientIds, paths []string, err error) {
// This parses the following config blocks
/*
openid_auth {
issuer http://issuer.com
clientid client.id.1
clientid client.id.2
path /service1/
path /service2/
}
*/
for c.Next() {
args := c.RemainingArgs()
switch len(args) {
case 0:
// no argument passed, check the config block
for c.NextBlock() {
switch c.Val() {
case "path":
path, err := parseSingleValue(c)
if err != nil {
return "", nil, nil, err
}
paths = append(paths, path)
case "issuer":
if issuer != "" {
return issuer, clientIds, paths, errors.New("openidauth: only 1 issuer can be configured")
}
is, err := parseSingleValue(c)
if err != nil {
return "", nil, nil, err
}
issuer = is
case "clientid":
clientID, err := parseSingleValue(c)
if err != nil {
return "", nil, nil, err
}
clientIds = append(clientIds, clientID)
}
}
default:
// we don't want any arguments
return "", nil, nil, c.ArgErr()
}
}
if issuer == "" {
return issuer, clientIds, paths, errors.New("Openidauth: issuer cannot be empty")
}
if len(clientIds) == 0 {
return issuer, clientIds, paths, errors.New("Openidauth: at least 1 clientid needs to be set up")
}
if len(paths) == 0 {
return issuer, clientIds, paths, errors.New("Openidauth: at least 1 path needs to be set up")
}
return issuer, clientIds, paths, nil
}