oidc-forward-auth/pkg/forwardauth/session.go

61 lines
1.3 KiB
Go

package forwardauth
import (
"time"
"github.com/StiviiK/keycloak-traefik-forward-auth/pkg/options"
"github.com/google/uuid"
"github.com/pzentenoe/go-cache"
)
type SessionCache struct {
internal *cache.Cache
longLived bool
}
type SessionCacheItem struct {
IDToken string
RefreshToken string
}
func newSessionCache(options *options.Options) SessionCache {
longLived := options.SessionLifetime > 0
var nd int
if longLived {
nd = options.SessionLifetime
} else {
nd = 12
}
return SessionCache{
internal: cache.New(time.Hour*time.Duration(nd), time.Hour),
longLived: longLived,
}
}
func (c *SessionCache) Get(sessionId string) *SessionCacheItem {
itm, _ := c.internal.Get(sessionId)
if itm == nil {
return nil
}
return itm.(*SessionCacheItem)
}
func (c *SessionCache) Create(session *SessionCacheItem) string {
sessionId := uuid.New().String()
c.internal.SetDefault(sessionId, session)
return sessionId
}
func (c *SessionCache) Update(sessionId string, session *SessionCacheItem) {
_, exp, found := c.internal.GetWithExpiration(sessionId)
if found && c.longLived {
c.internal.Set(sessionId, session, exp.Sub(time.Now()))
} else {
c.internal.SetDefault(sessionId, session)
}
}
func (c *SessionCache) Delete(sessionId string) {
c.internal.Delete(sessionId)
}