136 lines
4.3 KiB
Go
136 lines
4.3 KiB
Go
package session
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
"github.com/authorizerdev/authorizer/server/envstore"
|
|
"github.com/go-redis/redis/v8"
|
|
)
|
|
|
|
// SessionStore is a struct that defines available session stores
|
|
// If redis store is available, higher preference is given to that store.
|
|
// Else in memory store is used.
|
|
type SessionStore struct {
|
|
InMemoryStoreObj *InMemoryStore
|
|
RedisMemoryStoreObj *RedisStore
|
|
}
|
|
|
|
// SessionStoreObj is a global variable that holds the
|
|
// reference to various session store instances
|
|
var SessionStoreObj SessionStore
|
|
|
|
// SetUserSession sets the user session in the session store
|
|
func SetUserSession(userId, accessToken, refreshToken string) {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.AddUserSession(userId, accessToken, refreshToken)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.AddUserSession(userId, accessToken, refreshToken)
|
|
}
|
|
}
|
|
|
|
// DeleteUserSession deletes the particular user session from the session store
|
|
func DeleteUserSession(userId, accessToken string) {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.DeleteUserSession(userId, accessToken)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.DeleteUserSession(userId, accessToken)
|
|
}
|
|
}
|
|
|
|
// DeleteAllSessions deletes all the sessions from the session store
|
|
func DeleteAllUserSession(userId string) {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.DeleteAllUserSession(userId)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.DeleteAllUserSession(userId)
|
|
}
|
|
}
|
|
|
|
// GetUserSession returns the user session from the session store
|
|
func GetUserSession(userId, accessToken string) string {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
return SessionStoreObj.RedisMemoryStoreObj.GetUserSession(userId, accessToken)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
return SessionStoreObj.InMemoryStoreObj.GetUserSession(userId, accessToken)
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// ClearStore clears the session store for authorizer tokens
|
|
func ClearStore() {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.ClearStore()
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.ClearStore()
|
|
}
|
|
}
|
|
|
|
// SetSocialLoginState sets the social login state in the session store
|
|
func SetSocailLoginState(key, state string) {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.SetSocialLoginState(key, state)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.SetSocialLoginState(key, state)
|
|
}
|
|
}
|
|
|
|
// GetSocialLoginState returns the social login state from the session store
|
|
func GetSocailLoginState(key string) string {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
return SessionStoreObj.RedisMemoryStoreObj.GetSocialLoginState(key)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
return SessionStoreObj.InMemoryStoreObj.GetSocialLoginState(key)
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// RemoveSocialLoginState removes the social login state from the session store
|
|
func RemoveSocialLoginState(key string) {
|
|
if SessionStoreObj.RedisMemoryStoreObj != nil {
|
|
SessionStoreObj.RedisMemoryStoreObj.RemoveSocialLoginState(key)
|
|
}
|
|
if SessionStoreObj.InMemoryStoreObj != nil {
|
|
SessionStoreObj.InMemoryStoreObj.RemoveSocialLoginState(key)
|
|
}
|
|
}
|
|
|
|
// InitializeSessionStore initializes the SessionStoreObj based on environment variables
|
|
func InitSession() {
|
|
if envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyRedisURL) != "" {
|
|
log.Println("using redis store to save sessions")
|
|
opt, err := redis.ParseURL(envstore.EnvInMemoryStoreObj.GetStringStoreEnvVariable(constants.EnvKeyRedisURL))
|
|
if err != nil {
|
|
log.Fatalln("Error parsing redis url:", err)
|
|
}
|
|
rdb := redis.NewClient(opt)
|
|
ctx := context.Background()
|
|
_, err = rdb.Ping(ctx).Result()
|
|
|
|
if err != nil {
|
|
log.Fatalln("Error connecting to redis server", err)
|
|
}
|
|
SessionStoreObj.RedisMemoryStoreObj = &RedisStore{
|
|
ctx: ctx,
|
|
store: rdb,
|
|
}
|
|
|
|
} else {
|
|
log.Println("using in memory store to save sessions")
|
|
SessionStoreObj.InMemoryStoreObj = &InMemoryStore{
|
|
store: map[string]map[string]string{},
|
|
socialLoginState: map[string]string{},
|
|
}
|
|
}
|
|
}
|