ultisuite-backend/internal/auth/verifier_retry.go
2026-05-24 00:03:36 +02:00

44 lines
912 B
Go

package auth
import (
"context"
"log/slog"
"time"
)
// NewVerifierWithRetry waits for the OIDC provider (e.g. Authentik blueprints) to become ready.
func NewVerifierWithRetry(ctx context.Context, issuerURL, clientID, discoveryHost string, attempts int, delay time.Duration) (*Verifier, error) {
if issuerURL == "" || clientID == "" {
return nil, nil
}
if attempts < 1 {
attempts = 1
}
var lastErr error
for i := 1; i <= attempts; i++ {
verifier, err := NewVerifier(ctx, issuerURL, clientID, discoveryHost)
if err == nil {
if i > 1 {
slog.Info("OIDC verifier ready", "attempt", i)
}
return verifier, nil
}
lastErr = err
if i == attempts {
break
}
slog.Warn("OIDC verifier not ready, retrying",
"attempt", i,
"max", attempts,
"error", err,
)
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-time.After(delay):
}
}
return nil, lastErr
}