From c768a0d290da2218835fbeb9873ccdee6105c889 Mon Sep 17 00:00:00 2001 From: Patryk Dobrowolski Date: Thu, 24 Oct 2024 14:39:17 +0200 Subject: [PATCH] Allow 10 minutes of grace period before the token expire test move err to standalone handle Expired token as standalone func move error as separate --- pkg/oidc/oidc.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/pkg/oidc/oidc.go b/pkg/oidc/oidc.go index c54227fca8c8..5657fa72c98d 100644 --- a/pkg/oidc/oidc.go +++ b/pkg/oidc/oidc.go @@ -7,6 +7,7 @@ package oidc import ( "errors" "fmt" + "time" "github.com/coreos/go-oidc/v3/oidc" "github.com/go-jose/go-jose/v4" @@ -382,9 +383,14 @@ func (tokenProcessor *TokenProcessor) Issuer() string { func (tokenProcessor *TokenProcessor) VerifyAndExtractClaims(ctx context.Context, verifier TokenVerifierInterface, claims ClaimsInterface) error { logger := tokenProcessor.logger token, err := verifier.Verify(ctx, tokenProcessor.rawToken) + var tokenExpiryError *oidc.TokenExpiredError + if errors.As(err, &tokenExpiryError) { + token, err = tokenProcessor.handleExpiredToken(ctx, tokenExpiryError, logger, err) + } if err != nil { return fmt.Errorf("failed to verify token: %w", err) } + logger.Debugw("Getting claims from token") err = token.Claims(claims) if err != nil { @@ -397,3 +403,30 @@ func (tokenProcessor *TokenProcessor) VerifyAndExtractClaims(ctx context.Context } return nil } + +func (tokenProcessor *TokenProcessor) handleExpiredToken(ctx context.Context, tokenExpiryError *oidc.TokenExpiredError, logger LoggerInterface, err error) (Token, error) { + expiryTime := tokenExpiryError.Expiry + now := time.Now() + elapsed := now.Sub(expiryTime) + gracePeriod := 10 * time.Minute + if elapsed <= gracePeriod { + newVerifierConfig := tokenProcessor.verifierConfig + newVerifierConfig.SkipExpiryCheck = true + + provider, err := NewProviderFromDiscovery(ctx, logger, tokenProcessor.issuer.IssuerURL) + if err != nil { + return Token{}, fmt.Errorf("failed to create provider: %w", err) + } + + newVerifier := provider.NewVerifier(logger, newVerifierConfig) + token, err := newVerifier.Verify(ctx, tokenProcessor.rawToken) + + if err != nil { + return Token{}, fmt.Errorf("failed to verify token after skipping expiry check: %w", err) + } + + return token, nil + } else { + return Token{}, fmt.Errorf("token expired more than %v ago: %w", gracePeriod, err) + } +}