...
1
16
17 package routes
18
19 import (
20 "net/http"
21
22 restful "github.com/emicklei/go-restful/v3"
23
24 "k8s.io/klog/v2"
25 "k8s.io/kubernetes/pkg/serviceaccount"
26 )
27
28
29
30
31
32
33 const (
34
35
36 headerCacheControl = "Cache-Control"
37 cacheControl = "public, max-age=3600"
38
39
40 mimeJWKS = "application/jwk-set+json"
41 )
42
43
44 type OpenIDMetadataServer struct {
45 configJSON []byte
46 keysetJSON []byte
47 }
48
49
50
51
52 func NewOpenIDMetadataServer(configJSON, keysetJSON []byte) *OpenIDMetadataServer {
53 return &OpenIDMetadataServer{
54 configJSON: configJSON,
55 keysetJSON: keysetJSON,
56 }
57 }
58
59
60 func (s *OpenIDMetadataServer) Install(c *restful.Container) {
61
62
63
64 cfg := new(restful.WebService).
65 Produces(restful.MIME_JSON)
66
67 cfg.Path(serviceaccount.OpenIDConfigPath).Route(
68 cfg.GET("").
69 To(fromStandard(s.serveConfiguration)).
70 Doc("get service account issuer OpenID configuration, also known as the 'OIDC discovery doc'").
71 Operation("getServiceAccountIssuerOpenIDConfiguration").
72
73 Returns(http.StatusOK, "OK", ""))
74 c.Add(cfg)
75
76
77 jwks := new(restful.WebService).
78 Produces(mimeJWKS)
79
80 jwks.Path(serviceaccount.JWKSPath).Route(
81 jwks.GET("").
82 To(fromStandard(s.serveKeys)).
83 Doc("get service account issuer OpenID JSON Web Key Set (contains public token verification keys)").
84 Operation("getServiceAccountIssuerOpenIDKeyset").
85
86 Returns(http.StatusOK, "OK", ""))
87 c.Add(jwks)
88 }
89
90
91 func fromStandard(h http.HandlerFunc) restful.RouteFunction {
92 return func(req *restful.Request, resp *restful.Response) {
93 h(resp, req.Request)
94 }
95 }
96
97 func (s *OpenIDMetadataServer) serveConfiguration(w http.ResponseWriter, req *http.Request) {
98 w.Header().Set(restful.HEADER_ContentType, restful.MIME_JSON)
99 w.Header().Set(headerCacheControl, cacheControl)
100 if _, err := w.Write(s.configJSON); err != nil {
101 klog.Errorf("failed to write service account issuer metadata response: %v", err)
102 return
103 }
104 }
105
106 func (s *OpenIDMetadataServer) serveKeys(w http.ResponseWriter, req *http.Request) {
107
108 w.Header().Set(restful.HEADER_ContentType, mimeJWKS)
109 w.Header().Set(headerCacheControl, cacheControl)
110 if _, err := w.Write(s.keysetJSON); err != nil {
111 klog.Errorf("failed to write service account issuer JWKS response: %v", err)
112 return
113 }
114 }
115
View as plain text