Documentation
¶
Overview ¶
Package store provides SessionStore implementations for the sessions package.
MemoryStore keeps sessions in process memory. RedisStore persists sessions in Redis with a TTL derived from Session.Expired. Keys are {prefix}session:{token}; the prefix is empty unless WithKeyPrefix is given.
Index ¶
- Variables
- type MemoryStore
- type RedisOption
- type RedisStore
- func (s *RedisStore[C]) Close() error
- func (s *RedisStore[C]) Create(session sessions.Session[C]) error
- func (s *RedisStore[C]) Delete(refreshToken string) error
- func (s *RedisStore[C]) Read(refreshToken string) (session sessions.Session[C], err error)
- func (s *RedisStore[C]) RevokeUser(subject string, ttl time.Duration) error
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrEmptySubject = errors.New("subject must not be empty")
ErrEmptySubject is returned by RevokeUser for an empty subject.
var ErrNonPositiveTTL = errors.New("session ttl must be positive")
ErrNonPositiveTTL is returned by RedisStore.Create when Session.Expired is not in the future.
Functions ¶
This section is empty.
Types ¶
type MemoryStore ¶
MemoryStore is an in-memory SessionStore backed by sync.Map. Sessions are lost on process restart and are not shared across instances.
func NewMemoryStore ¶
func NewMemoryStore[C jwt.Claims]() *MemoryStore[C]
NewMemoryStore returns an empty MemoryStore.
Example ¶
package main
import (
"github.com/golang-jwt/jwt/v5"
"github.com/mrFokin/sessions/v2/store"
)
func main() {
s := store.NewMemoryStore[jwt.MapClaims]()
_ = s
}
Output:
func (*MemoryStore[C]) Create ¶
func (m *MemoryStore[C]) Create(s sessions.Session[C]) error
Create stores session keyed by session.Token.
func (*MemoryStore[C]) Delete ¶
func (m *MemoryStore[C]) Delete(refreshToken string) error
Delete removes a session by refresh token.
func (*MemoryStore[C]) Read ¶
func (m *MemoryStore[C]) Read(refreshToken string) (session sessions.Session[C], err error)
Read loads a session by refresh token. It returns sessions.ErrSessionNotFound if the session does not exist.
func (*MemoryStore[C]) RevokeUser ¶ added in v2.3.0
func (m *MemoryStore[C]) RevokeUser(subject string, _ time.Duration) error
RevokeUser makes every session of subject created up to now unreadable. The revocation is kept for the life of the process, so ttl is ignored. It returns ErrEmptySubject for an empty subject.
type RedisOption ¶ added in v2.2.0
type RedisOption func(*redisConfig)
RedisOption configures a RedisStore.
func WithKeyPrefix ¶ added in v2.2.0
func WithKeyPrefix(prefix string) RedisOption
WithKeyPrefix prepends prefix to every key the store writes, so several applications can share one Redis database without seeing each other's sessions (and so an ACL rule like ~myapp:* can fence each of them in). The prefix is used verbatim — include the separator yourself: WithKeyPrefix("myapp:") gives myapp:session:{token}. Default: no prefix.
Example ¶
package main
import (
"github.com/golang-jwt/jwt/v5"
"github.com/mrFokin/sessions/v2/store"
"github.com/redis/go-redis/v9"
)
func main() {
// Keys become myapp:session:{token}, so other applications sharing this
// Redis database cannot read or delete these sessions.
s := store.NewRedisStore[jwt.MapClaims](&redis.Options{
Addr: "localhost:6379",
}, store.WithKeyPrefix("myapp:"))
defer s.Close()
}
Output:
type RedisStore ¶
RedisStore is a Redis-backed SessionStore. Keys are {prefix}session:{token} (no prefix unless WithKeyPrefix is given) with TTL until Session.Expired.
func NewRedisStore ¶
func NewRedisStore[C jwt.Claims](opt *redis.Options, opts ...RedisOption) *RedisStore[C]
NewRedisStore returns a RedisStore using opt. Call Close when finished.
Example ¶
package main
import (
"github.com/golang-jwt/jwt/v5"
"github.com/mrFokin/sessions/v2/store"
"github.com/redis/go-redis/v9"
)
func main() {
s := store.NewRedisStore[jwt.MapClaims](&redis.Options{
Addr: "localhost:6379",
})
defer s.Close()
}
Output:
func (*RedisStore[C]) Close ¶
func (s *RedisStore[C]) Close() error
Close closes the underlying Redis client.
func (*RedisStore[C]) Create ¶
func (s *RedisStore[C]) Create(session sessions.Session[C]) error
Create stores session in Redis. It returns ErrNonPositiveTTL when Session.Expired is not in the future.
func (*RedisStore[C]) Delete ¶
func (s *RedisStore[C]) Delete(refreshToken string) error
Delete removes a session by refresh token.
func (*RedisStore[C]) Read ¶
func (s *RedisStore[C]) Read(refreshToken string) (session sessions.Session[C], err error)
Read loads a session by refresh token. It returns sessions.ErrSessionNotFound if the key is missing.
func (*RedisStore[C]) RevokeUser ¶ added in v2.3.0
func (s *RedisStore[C]) RevokeUser(subject string, ttl time.Duration) error
RevokeUser makes every session of subject (its "sub" claim) created up to now unreadable by recording the time under {prefix}revoked:{subject} for ttl. Read compares it with Session.Created, so nothing is enumerated or deleted here and sessions started later are unaffected. It returns ErrEmptySubject for an empty subject and ErrNonPositiveTTL when ttl is not positive.