From 9a284c03ca1639315ed88bf79b30cc76ab923e4c Mon Sep 17 00:00:00 2001 From: Lakhan Samani Date: Mon, 3 Apr 2023 10:26:27 +0530 Subject: [PATCH] fix: redis session --- server/go.mod | 1 + server/go.sum | 6 +++++ .../memorystore/providers/inmemory/store.go | 6 ----- .../providers/inmemory/stores/env_store.go | 4 ++++ .../inmemory/stores/session_store.go | 14 ++++++++--- .../providers/inmemory/stores/state_store.go | 2 ++ server/memorystore/providers/providers.go | 2 -- .../memorystore/providers/redis/provider.go | 6 ++--- server/memorystore/providers/redis/store.go | 24 ++++++------------- 9 files changed, 34 insertions(+), 31 deletions(-) diff --git a/server/go.mod b/server/go.mod index 1402756..9e8db75 100644 --- a/server/go.mod +++ b/server/go.mod @@ -21,6 +21,7 @@ require ( github.com/joho/godotenv v1.3.0 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/redis/go-redis/v9 v9.0.3 // indirect github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.8.0 diff --git a/server/go.sum b/server/go.sum index e6c51a5..98b2ca9 100644 --- a/server/go.sum +++ b/server/go.sum @@ -58,11 +58,15 @@ github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYE github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -295,6 +299,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= +github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robertkrimen/otto v0.0.0-20211024170158-b87d35c0b86f h1:a7clxaGmmqtdNTXyvrp/lVO/Gnkzlhc/+dLs5v965GM= diff --git a/server/memorystore/providers/inmemory/store.go b/server/memorystore/providers/inmemory/store.go index befd77f..85f46c5 100644 --- a/server/memorystore/providers/inmemory/store.go +++ b/server/memorystore/providers/inmemory/store.go @@ -13,12 +13,6 @@ func (c *provider) SetUserSession(userId, key, token string) error { return nil } -// GetAllUserSessions returns all the user sessions token from the in-memory store. -func (c *provider) GetAllUserSessions(userId string) (map[string]string, error) { - data := c.sessionStore.GetAll(userId) - return data, nil -} - // GetUserSession returns value for given session token func (c *provider) GetUserSession(userId, sessionToken string) (string, error) { return c.sessionStore.Get(userId, sessionToken), nil diff --git a/server/memorystore/providers/inmemory/stores/env_store.go b/server/memorystore/providers/inmemory/stores/env_store.go index d6ffe6a..46a909a 100644 --- a/server/memorystore/providers/inmemory/stores/env_store.go +++ b/server/memorystore/providers/inmemory/stores/env_store.go @@ -31,11 +31,15 @@ func (e *EnvStore) UpdateStore(store map[string]interface{}) { // GetStore returns the env store func (e *EnvStore) GetStore() map[string]interface{} { + e.mutex.Lock() + defer e.mutex.Unlock() return e.store } // Get returns the value of the key in evn store func (e *EnvStore) Get(key string) interface{} { + e.mutex.Lock() + defer e.mutex.Unlock() return e.store[key] } diff --git a/server/memorystore/providers/inmemory/stores/session_store.go b/server/memorystore/providers/inmemory/stores/session_store.go index d035312..627d37e 100644 --- a/server/memorystore/providers/inmemory/stores/session_store.go +++ b/server/memorystore/providers/inmemory/stores/session_store.go @@ -5,23 +5,31 @@ import ( "sync" ) +// SessionEntry is the struct for entry stored in store +type SessionEntry struct { + Value string + ExpiresAt int64 +} + // SessionStore struct to store the env variables type SessionStore struct { mutex sync.Mutex - store map[string]map[string]string + store map[string]map[string]*SessionEntry } // NewSessionStore create a new session store func NewSessionStore() *SessionStore { return &SessionStore{ mutex: sync.Mutex{}, - store: make(map[string]map[string]string), + store: make(map[string]map[string]*SessionEntry), } } // Get returns the value of the key in state store func (s *SessionStore) Get(key, subKey string) string { - return s.store[key][subKey] + s.mutex.Lock() + defer s.mutex.Unlock() + return s.store[key][subKey].Value } // Set sets the value of the key in state store diff --git a/server/memorystore/providers/inmemory/stores/state_store.go b/server/memorystore/providers/inmemory/stores/state_store.go index 2ba8417..2189a11 100644 --- a/server/memorystore/providers/inmemory/stores/state_store.go +++ b/server/memorystore/providers/inmemory/stores/state_store.go @@ -20,6 +20,8 @@ func NewStateStore() *StateStore { // Get returns the value of the key in state store func (s *StateStore) Get(key string) string { + s.mutex.Lock() + defer s.mutex.Unlock() return s.store[key] } diff --git a/server/memorystore/providers/providers.go b/server/memorystore/providers/providers.go index a4816c5..7388a97 100644 --- a/server/memorystore/providers/providers.go +++ b/server/memorystore/providers/providers.go @@ -4,8 +4,6 @@ package providers type Provider interface { // SetUserSession sets the user session for given user identifier in form recipe:user_id SetUserSession(userId, key, token string) error - // GetAllUserSessions returns all the user sessions from the session store - GetAllUserSessions(userId string) (map[string]string, error) // GetUserSession returns the session token for given token GetUserSession(userId, key string) (string, error) // DeleteUserSession deletes the user session diff --git a/server/memorystore/providers/redis/provider.go b/server/memorystore/providers/redis/provider.go index a91a300..084f207 100644 --- a/server/memorystore/providers/redis/provider.go +++ b/server/memorystore/providers/redis/provider.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/go-redis/redis/v8" + "github.com/redis/go-redis/v9" log "github.com/sirupsen/logrus" ) @@ -17,10 +17,11 @@ type RedisClient interface { HMGet(ctx context.Context, key string, fields ...string) *redis.SliceCmd HSet(ctx context.Context, key string, values ...interface{}) *redis.IntCmd HGet(ctx context.Context, key, field string) *redis.StringCmd - HGetAll(ctx context.Context, key string) *redis.StringStringMapCmd + HGetAll(ctx context.Context, key string) *redis.MapStringStringCmd Set(ctx context.Context, key string, value interface{}, expiration time.Duration) *redis.StatusCmd Get(ctx context.Context, key string) *redis.StringCmd Scan(ctx context.Context, cursor uint64, match string, count int64) *redis.ScanCmd + Keys(ctx context.Context, pattern string) *redis.StringSliceCmd } type provider struct { @@ -70,7 +71,6 @@ func NewRedisProvider(redisURL string) (*provider, error) { log.Debug("error connecting to redis: ", err) return nil, err } - return &provider{ ctx: ctx, store: rdb, diff --git a/server/memorystore/providers/redis/store.go b/server/memorystore/providers/redis/store.go index 21e3ecc..7a1c7a1 100644 --- a/server/memorystore/providers/redis/store.go +++ b/server/memorystore/providers/redis/store.go @@ -1,6 +1,7 @@ package redis import ( + "fmt" "strconv" "github.com/authorizerdev/authorizer/server/constants" @@ -16,28 +17,17 @@ var ( // SetUserSession sets the user session for given user identifier in form recipe:user_id func (c *provider) SetUserSession(userId, key, token string) error { - err := c.store.HSet(c.ctx, userId, key, token).Err() + err := c.store.Set(c.ctx, fmt.Sprintf("%s:%s", userId, key), token, 0).Err() if err != nil { - log.Debug("Error saving to redis: ", err) + log.Debug("Error saving user session to redis: ", err) return err } return nil } -// GetAllUserSessions returns all the user session token from the redis store. -func (c *provider) GetAllUserSessions(userID string) (map[string]string, error) { - data, err := c.store.HGetAll(c.ctx, userID).Result() - if err != nil { - log.Debug("error getting all user sessions from redis store: ", err) - return nil, err - } - - return data, nil -} - // GetUserSession returns the user session from redis store. func (c *provider) GetUserSession(userId, key string) (string, error) { - data, err := c.store.HGet(c.ctx, userId, key).Result() + data, err := c.store.Get(c.ctx, fmt.Sprintf("%s:%s", userId, key)).Result() if err != nil { return "", err } @@ -46,15 +36,15 @@ func (c *provider) GetUserSession(userId, key string) (string, error) { // DeleteUserSession deletes the user session from redis store. func (c *provider) DeleteUserSession(userId, key string) error { - if err := c.store.HDel(c.ctx, userId, constants.TokenTypeSessionToken+"_"+key).Err(); err != nil { + if err := c.store.Del(c.ctx, fmt.Sprintf("%s:%s", userId, constants.TokenTypeSessionToken+"_"+key)).Err(); err != nil { log.Debug("Error deleting user session from redis: ", err) return err } - if err := c.store.HDel(c.ctx, userId, constants.TokenTypeAccessToken+"_"+key).Err(); err != nil { + if err := c.store.Del(c.ctx, fmt.Sprintf("%s:%s", userId, constants.TokenTypeAccessToken+"_"+key)).Err(); err != nil { log.Debug("Error deleting user session from redis: ", err) return err } - if err := c.store.HDel(c.ctx, userId, constants.TokenTypeRefreshToken+"_"+key).Err(); err != nil { + if err := c.store.Del(c.ctx, fmt.Sprintf("%s:%s", userId, constants.TokenTypeRefreshToken+"_"+key)).Err(); err != nil { log.Debug("Error deleting user session from redis: ", err) return err }