{"record":{"id":"755ea4e4c87283e7","repo":"gofr-dev/gofr","slug":"invalid-interval-require-a-value-greater-than-1-s","errorCode":null,"errorMessage":"invalid interval, require a value greater than 1 second","messagePattern":"invalid interval, require a value greater than 1 second","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/http/middleware/oauth.go","lineNumber":23,"sourceCode":"\t\"crypto/rsa\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/golang-jwt/jwt/v5\"\n)\n\nvar (\n\terrEmptyProvider       = errors.New(\"require non-empty provider\")\n\terrInvalidInterval     = errors.New(\"invalid interval, require a value greater than 1 second\")\n\terrEmptyModulus        = errors.New(\"modulus is empty\")\n\terrEmptyPublicExponent = errors.New(\"public exponent is empty\")\n\terrEmptyResponseBody   = errors.New(\"response body is empty\")\n\terrInvalidURL          = errors.New(\"invalid URL\")\n)\n\nconst jwtRegexPattern = \"^[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]+$\"\n\n// PublicKeys stores a map of public keys identified by their key ID (kid).\ntype PublicKeys struct {\n\tmu   sync.RWMutex\n\tkeys map[string]*rsa.PublicKey\n}\n\n// JWKNotFound is an error type indicating a missing JSON Web Key Set (JWKS).\ntype JWKNotFound struct {\n}\n","sourceCodeStart":5,"sourceCodeEnd":41,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/http/middleware/oauth.go#L5-L41","documentation":"errInvalidInterval is returned by NewOAuthProvider in GoFr's OAuth middleware when the configured key-refresh interval is less than or equal to 1 second. The JWKS key cache requires a refresh interval greater than one second to avoid hammering the identity provider. Construction fails fast with this descriptive error.","triggerScenarios":"Calling NewOAuthProvider(provider, d) with d <= 1s (e.g. 0, negative durations, or exactly 1 * time.Second).","commonSituations":"Refresh interval read from config where the unit was misinterpreted (seconds vs milliseconds producing 0), a zero-valued duration variable never assigned, or an attempt to disable refresh by setting 0.","solutions":["Pass an interval greater than 1 second, e.g. 5 * time.Minute","Check the config parsing so the value's unit matches expectations (seconds vs ms)","Ensure the duration variable is actually initialized, not left at its zero value","Use a sane default (e.g. 15 * time.Minute) when config is absent"],"exampleFix":"// before\ninterval := time.Duration(cfg.Refresh) // cfg.Refresh=0 -> errInvalidInterval\n// after\ninterval := time.Duration(cfg.Refresh) * time.Second\nif interval <= time.Second { interval = 15 * time.Minute }\noauth, err := middleware.NewOAuthProvider(provider, interval)","handlingStrategy":"validation","validationCode":"interval := cfg.RefreshInterval\nif interval <= time.Second {\n    return fmt.Errorf(\"oauth refresh interval must be > 1s, got %v\", interval)\n}","typeGuard":"func intervalValid(d time.Duration) bool { return d > time.Second }","tryCatchPattern":"oauth, err := middleware.NewOAuthProvider(provider, interval)\nif err != nil {\n    if errors.Is(err, middleware.ErrInvalidInterval) {\n        log.Fatalf(\"invalid key refresh interval %v: must exceed 1s\", interval)\n    }\n    return err\n}","preventionTips":["Store durations in config with explicit units (e.g. Go duration strings like \"5m\")","Apply a default interval when config is absent or zero","Sanity-check duration parsing in unit tests","Avoid sentinel zero values meaning 'disable refresh'"],"tags":["oauth","jwt","config","gofr"],"backgroundTag":"invalid-refresh-interval","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}