mirror of
https://github.com/oauth2-proxy/oauth2-proxy.git
synced 2026-10-19 07:45:00 +02:00
Validate Redis session store health on startup
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
package validation
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/oauth2-proxy/oauth2-proxy/pkg/apis/options"
|
||||
"github.com/oauth2-proxy/oauth2-proxy/pkg/encryption"
|
||||
"github.com/oauth2-proxy/oauth2-proxy/pkg/sessions/redis"
|
||||
)
|
||||
|
||||
func validateSessionCookieMinimal(o *options.Options) []string {
|
||||
@@ -30,3 +34,50 @@ func validateSessionCookieMinimal(o *options.Options) []string {
|
||||
}
|
||||
return msgs
|
||||
}
|
||||
|
||||
// validateRedisSessionStore builds a Redis Client from the options and
|
||||
// attempts to connect, Set, Get and Del a random health check key
|
||||
func validateRedisSessionStore(o *options.Options) []string {
|
||||
if o.Session.Type != options.RedisSessionStoreType {
|
||||
return []string{}
|
||||
}
|
||||
|
||||
client, err := redis.NewRedisClient(o.Session.Redis)
|
||||
if err != nil {
|
||||
return []string{fmt.Sprintf("unable to initialize a redis client: %v", err)}
|
||||
}
|
||||
|
||||
nonce, err := encryption.Nonce()
|
||||
if err != nil {
|
||||
return []string{fmt.Sprintf("unable to generate a redis initialization test key: %v", err)}
|
||||
}
|
||||
|
||||
key := fmt.Sprintf("%s-healthcheck-%s", o.Cookie.Name, nonce)
|
||||
return sendRedisConnectionTest(client, key, nonce)
|
||||
}
|
||||
|
||||
func sendRedisConnectionTest(client redis.Client, key string, val string) []string {
|
||||
msgs := []string{}
|
||||
ctx := context.Background()
|
||||
|
||||
err := client.Set(ctx, key, []byte(val), time.Duration(60)*time.Second)
|
||||
if err != nil {
|
||||
msgs = append(msgs, fmt.Sprintf("unable to set a redis initialization key: %v", err))
|
||||
} else {
|
||||
gval, err := client.Get(ctx, key)
|
||||
if err != nil {
|
||||
msgs = append(msgs,
|
||||
fmt.Sprintf("unable to retrieve redis initialization key: %v", err))
|
||||
}
|
||||
if string(gval) != val {
|
||||
msgs = append(msgs,
|
||||
"the retrieved redis initialization key did not match the value we set")
|
||||
}
|
||||
}
|
||||
|
||||
err = client.Del(ctx, key)
|
||||
if err != nil {
|
||||
msgs = append(msgs, fmt.Sprintf("unable to delete the redis initialization key: %v", err))
|
||||
}
|
||||
return msgs
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user