Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit d4af727

Browse files
authored
Merge pull request #96 from jumpstarter-dev/token-followup
Check token for validity
2 parents 36d6f1c + b80dca3 commit d4af727

3 files changed

Lines changed: 43 additions & 5 deletions

File tree

internal/controller/client_controller.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ func (r *ClientReconciler) clientSecretExists(
7878
ctx context.Context,
7979
client *jumpstarterdevv1alpha1.Client,
8080
) (bool, error) {
81+
logger := log.FromContext(ctx)
82+
8183
if client.Status.Credential == nil {
8284
return false, nil
8385
}
@@ -87,8 +89,17 @@ func (r *ClientReconciler) clientSecretExists(
8789
Namespace: client.Namespace,
8890
Name: client.Status.Credential.Name,
8991
}, secret)
92+
if err != nil {
93+
return false, kclient.IgnoreNotFound(err)
94+
}
95+
96+
token, ok := secret.Data["token"]
97+
if !ok || r.Signer.Verify(string(token)) != nil {
98+
logger.Info("reconcileStatusCredential: the client secret is invalid", "client", client.Name)
99+
return false, r.Delete(ctx, secret)
100+
}
90101

91-
return err == nil, kclient.IgnoreNotFound(err)
102+
return true, nil
92103
}
93104

94105
func (r *ClientReconciler) reconcileStatusCredential(
@@ -158,7 +169,7 @@ func (r *ClientReconciler) secretForClient(client *jumpstarterdevv1alpha1.Client
158169
},
159170
}
160171
// enable garbage collection on the created resource
161-
if err := controllerutil.SetOwnerReference(client, secret, r.Scheme); err != nil {
172+
if err := controllerutil.SetControllerReference(client, secret, r.Scheme); err != nil {
162173
return nil, fmt.Errorf("secretForClient, error setting owner reference: %w", err)
163174
}
164175
return secret, nil
@@ -168,5 +179,6 @@ func (r *ClientReconciler) secretForClient(client *jumpstarterdevv1alpha1.Client
168179
func (r *ClientReconciler) SetupWithManager(mgr ctrl.Manager) error {
169180
return ctrl.NewControllerManagedBy(mgr).
170181
For(&jumpstarterdevv1alpha1.Client{}).
182+
Owns(&corev1.Secret{}).
171183
Complete(r)
172184
}

internal/controller/exporter_controller.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ func (r *ExporterReconciler) exporterSecretExists(
9090
ctx context.Context,
9191
exporter *jumpstarterdevv1alpha1.Exporter,
9292
) (bool, error) {
93+
logger := log.FromContext(ctx)
94+
9395
if exporter.Status.Credential == nil {
9496
return false, nil
9597
}
@@ -99,8 +101,18 @@ func (r *ExporterReconciler) exporterSecretExists(
99101
Namespace: exporter.Namespace,
100102
Name: exporter.Status.Credential.Name,
101103
}, secret)
104+
if err != nil {
105+
return false, client.IgnoreNotFound(err)
106+
}
107+
108+
token, ok := secret.Data["token"]
109+
110+
if !ok || r.Signer.Verify(string(token)) != nil {
111+
logger.Info("reconcileStatusCredential: the exporter secret is invalid", "exporter", exporter.Name)
112+
return false, r.Delete(ctx, secret)
113+
}
102114

103-
return err == nil, client.IgnoreNotFound(err)
115+
return true, nil
104116
}
105117

106118
func (r *ExporterReconciler) reconcileStatusCredential(
@@ -118,7 +130,7 @@ func (r *ExporterReconciler) reconcileStatusCredential(
118130
if !exists {
119131
if exporter.Status.Credential != nil {
120132
// TODO: Send an alert notification to cluster
121-
logger.Info("the exporter secret has ceased to exist, will be recreated", "exporter", exporter.Name)
133+
logger.Info("reconcileStatusCredential: the exporter secret has ceased to exist, will be recreated", "exporter", exporter.Name)
122134
} else {
123135
logger.Info("reconcileStatusCredential: creating credential for exporter")
124136
}
@@ -197,7 +209,7 @@ func (r *ExporterReconciler) secretForExporter(exporter *jumpstarterdevv1alpha1.
197209
},
198210
}
199211
// enable garbage collection on the created resource
200-
if err := controllerutil.SetOwnerReference(exporter, secret, r.Scheme); err != nil {
212+
if err := controllerutil.SetControllerReference(exporter, secret, r.Scheme); err != nil {
201213
return nil, fmt.Errorf("secretForExporter, error setting owner reference: %w", err)
202214
}
203215
return secret, nil
@@ -208,5 +220,6 @@ func (r *ExporterReconciler) SetupWithManager(mgr ctrl.Manager) error {
208220
return ctrl.NewControllerManagedBy(mgr).
209221
For(&jumpstarterdevv1alpha1.Exporter{}).
210222
Owns(&jumpstarterdevv1alpha1.Lease{}).
223+
Owns(&corev1.Secret{}).
211224
Complete(r)
212225
}

internal/oidc/op.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ func (k *Signer) Register(group gin.IRoutes) {
9090
})
9191
}
9292

93+
func (k *Signer) Verify(token string) error {
94+
_, err := jwt.Parse(token, func(t *jwt.Token) (interface{}, error) {
95+
return &k.privatekey.PublicKey, nil
96+
},
97+
jwt.WithValidMethods([]string{
98+
jwt.SigningMethodES256.Alg(),
99+
}),
100+
jwt.WithIssuer(k.issuer),
101+
jwt.WithAudience(k.audience),
102+
)
103+
return err
104+
}
105+
93106
func (k *Signer) Token(
94107
subject string,
95108
) (string, error) {

0 commit comments

Comments
 (0)