mirror of
https://github.com/datarhei/core.git
synced 2025-10-05 07:57:13 +08:00
64 lines
2.1 KiB
Go
64 lines
2.1 KiB
Go
package jwks
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Options represents the configuration options for a JWKs.
|
|
type Config struct {
|
|
|
|
// Client is the HTTP client used to get the JWKs via HTTP.
|
|
Client *http.Client
|
|
|
|
// RefreshErrorHandler is a function that consumes errors that happen during a JWKs refresh. This is only effectual
|
|
// if RefreshInterval is not nil.
|
|
RefreshErrorHandler ErrorHandler
|
|
|
|
// RefreshInterval is the duration to refresh the JWKs in the background via a new HTTP request. If this is not nil,
|
|
// then a background refresh will be requested in a separate goroutine at this interval until the JWKs method
|
|
// EndBackground is called.
|
|
RefreshInterval time.Duration
|
|
|
|
// RefreshRateLimit limits the rate at which refresh requests are granted. Only one refresh request can be queued
|
|
// at a time any refresh requests received while there is already a queue are ignored. It does not make sense to
|
|
// have RefreshInterval's value shorter than this.
|
|
RefreshRateLimit time.Duration
|
|
|
|
// RefreshTimeout is the duration for the context used to create the HTTP request for a refresh of the JWKs. This
|
|
// defaults to one minute. This is only effectual if RefreshInterval is not nil.
|
|
RefreshTimeout time.Duration
|
|
|
|
// RefreshUnknownKID indicates that the JWKs refresh request will occur every time a kid that isn't cached is seen.
|
|
// Without specifying a RefreshInterval a malicious client could self-sign X JWTs, send them to this service,
|
|
// then cause potentially high network usage proportional to X.
|
|
RefreshUnknownKID bool
|
|
}
|
|
|
|
var defaultConfig = Config{
|
|
Client: http.DefaultClient,
|
|
RefreshTimeout: time.Minute,
|
|
}
|
|
|
|
func applyConfigDefaults(config *Config) {
|
|
if config.Client == nil {
|
|
config.Client = defaultConfig.Client
|
|
}
|
|
|
|
if config.RefreshErrorHandler == nil {
|
|
config.RefreshErrorHandler = defaultConfig.RefreshErrorHandler
|
|
}
|
|
|
|
if config.RefreshInterval < 0 {
|
|
config.RefreshInterval = defaultConfig.RefreshInterval
|
|
}
|
|
|
|
if config.RefreshRateLimit < 0 {
|
|
config.RefreshRateLimit = defaultConfig.RefreshRateLimit
|
|
}
|
|
|
|
if config.RefreshTimeout <= 0 {
|
|
config.RefreshTimeout = defaultConfig.RefreshTimeout
|
|
}
|
|
}
|