diff --git a/cmd/wonderwall/main.go b/cmd/wonderwall/main.go index fab2543..4b49cf2 100644 --- a/cmd/wonderwall/main.go +++ b/cmd/wonderwall/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "github.com/go-redis/redis/v8" "github.com/nais/wonderwall/pkg/session" "net/http" "os" @@ -51,6 +52,19 @@ func run() error { } crypt := cryptutil.New(key) + var sessionStore session.Store + if len(cfg.Redis) > 0 { + redisClient := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: cfg.Redis, + }) + sessionStore = session.NewRedis(redisClient) + log.Infof("Using Redis as session backing store") + } else { + sessionStore = session.NewMemory() + log.Warnf("Redis not configured, using in-memory session backing store; not suitable for multi-pod deployments!") + } + oauthConfig := oauth2.Config{ ClientID: cfg.IDPorten.ClientID, Endpoint: oauth2.Endpoint{ @@ -67,7 +81,7 @@ func run() error { OauthConfig: oauthConfig, UpstreamHost: cfg.UpstreamHost, SecureCookies: true, - Sessions: session.NewMemory(), + Sessions: sessionStore, IdTokenVerifier: oidc.NewVerifier( cfg.IDPorten.WellKnown.Issuer, oidc.NewRemoteKeySet(context.Background(), cfg.IDPorten.WellKnown.JwksURI), diff --git a/docker-compose.yml b/docker-compose.yml index 09b75e9..748a590 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ version: "3" services: - postgres: + redis: image: redis:6 ports: - "6379:6379" diff --git a/pkg/config/config.go b/pkg/config/config.go index 5ba004e..b69f69c 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -13,6 +13,7 @@ type Config struct { IDPorten IDPorten `json:"idporten"` LogFormat string `json:"log-format"` LogLevel string `json:"log-level"` + Redis string `json:"redis"` } type IDPorten struct { @@ -31,6 +32,7 @@ const ( UpstreamHost = "upstream-host" LogFormat = "log-format" LogLevel = "log-level" + Redis="redis" IDPortenClientID = "idporten.client-id" IDPortenClientJWK = "idporten.client-jwk" IDPortenRedirectURI = "idporten.redirect-uri" @@ -55,6 +57,7 @@ func Initialize() *Config { flag.String(LogLevel, "debug", "Logging verbosity level.") flag.String(BindAddress, "127.0.0.1:8090", "Listen address.") flag.String(UpstreamHost, "127.0.0.1:8080", "Address of upstream host.") + flag.String(Redis, "", "Address of Redis. An empty value will use in-memory session storage.") flag.String(IDPortenSecurityLevel, "Level4", "Requested security level, either Level3 or Level4.") flag.String(IDPortenLocale, "nb", "Locale for OAuth2 consent screen.") flag.String(IDPortenPostLogoutRedirectURI, "https://nav.no", "URI for redirecting the user after successful logout at IDPorten.")