Skip to content

Commit 012e842

Browse files
authored
Support Webservice-less CheckRequest calls (#59)
* feat: Support Webservice-less CheckRequest calls * Using camelCase for Webservice-less context instead of kebab-case * Fix readRequestContext when wsvc=none
1 parent f738cb2 commit 012e842

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

pkg/auth/authenticator.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77
"net/url"
88
"os"
9+
"strconv"
910
"strings"
1011
"sync"
1112
"time"
@@ -168,6 +169,11 @@ func (a *Authenticator) Check(ctx context.Context, request *Request) (finalRespo
168169
ctx, span := startSpan(ctx, request.Request, wsvc, ns)
169170
defer endSpan(span, start_time, finalResponse, reason)
170171

172+
if wsvc == "none" {
173+
reason, headers := a.CheckWebserviceless(ctx, request)
174+
return generateResponse(reason, headers), nil
175+
}
176+
171177
if reason != "" {
172178
return generateResponse(reason, nil), nil
173179
}
@@ -202,6 +208,50 @@ func (a *Authenticator) Check(ctx context.Context, request *Request) (finalRespo
202208
return
203209
}
204210

211+
func (a *Authenticator) CheckWebserviceless(ctx context.Context, request *Request) (CerberusReason, ExtraHeaders) {
212+
wsvc, reason := wsvcForWebservicelessRequest(request)
213+
if reason != "" {
214+
return reason, nil
215+
}
216+
217+
var extraHeaders ExtraHeaders
218+
reason = a.checkServiceUpstreamAuth(wsvc, request, &extraHeaders, ctx)
219+
return reason, extraHeaders
220+
}
221+
222+
func wsvcForWebservicelessRequest(request *Request) (WebservicesCacheEntry, CerberusReason) {
223+
if request.Context["authURL"] == "" {
224+
return WebservicesCacheEntry{}, CerberusReasonWebservicelessAuthURLEmpty
225+
}
226+
227+
readTokenFrom := request.Context["readTokenFrom"]
228+
if readTokenFrom == "" {
229+
readTokenFrom = "Authorization"
230+
}
231+
writeTokenTo := request.Context["writeTokenTo"]
232+
if writeTokenTo == "" {
233+
writeTokenTo = "Authorization"
234+
}
235+
timeout, err := strconv.Atoi(request.Context["timeout"])
236+
if err != nil {
237+
timeout = 200
238+
}
239+
240+
return WebservicesCacheEntry{
241+
WebService: v1alpha1.WebService{
242+
Spec: v1alpha1.WebServiceSpec{
243+
UpstreamHttpAuth: v1alpha1.UpstreamHttpAuthService{
244+
Address: request.Context["authURL"],
245+
ReadTokenFrom: readTokenFrom,
246+
WriteTokenTo: writeTokenTo,
247+
Timeout: timeout,
248+
CareHeaders: strings.Split(request.Context["careHeaders"], ","),
249+
},
250+
},
251+
},
252+
}, ""
253+
}
254+
205255
// startSpan starts span for Check Function
206256
func startSpan(ctx context.Context, request http.Request, wsvc string, ns string) (context.Context, trace.Span) {
207257
parentCtx := tracing.ReadParentSpanFromRequest(ctx, request)
@@ -255,6 +305,10 @@ func readRequestContext(request *Request) (wsvc string, ns string, reason Cerber
255305
return "", "", CerberusReasonWebserviceEmpty
256306
}
257307

308+
if wsvc == "none" {
309+
return wsvc, "", ""
310+
}
311+
258312
ns = request.Context["namespace"]
259313
if ns == "" {
260314
return "", "", CerberusReasonWebserviceNamespaceEmpty

pkg/auth/cerberus_reasons.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,7 @@ const (
104104
// CerberusReasonUpstreamAuthServiceIsOverloaded indicates that the upstream authentication service
105105
// is currently overloaded and unable to process new requests
106106
CerberusReasonUpstreamAuthServiceIsOverloaded CerberusReason = "upstream-auth-service-is-overloaded"
107+
108+
// CerberusReasonWebservicelessAuthURLEmpty means that the webserviceless request does not contain an auth url
109+
CerberusReasonWebservicelessAuthURLEmpty CerberusReason = "webserviceless-auth-url-empty"
107110
)

0 commit comments

Comments
 (0)