new session manager code
This commit is contained in:
81
src/session/session_manager.go
Normal file
81
src/session/session_manager.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package session
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"astraltech.xyz/accountmanager/src/logging"
|
||||
)
|
||||
|
||||
const SessionCookieName = "session_token"
|
||||
|
||||
type SessionManager struct {
|
||||
store SessionStore
|
||||
}
|
||||
|
||||
type StoreType int
|
||||
|
||||
const (
|
||||
InMemory StoreType = iota
|
||||
)
|
||||
|
||||
func CreateSessionManager(storeType StoreType) *SessionManager {
|
||||
sessionManager := SessionManager{}
|
||||
switch storeType {
|
||||
case InMemory:
|
||||
{
|
||||
sessionManager.store = NewMemoryStore()
|
||||
break
|
||||
}
|
||||
}
|
||||
return &sessionManager
|
||||
}
|
||||
|
||||
func (manager *SessionManager) CreateSession(userID string) (cookie *http.Cookie, err error) {
|
||||
logging.Debugf("Creating a new session for %s", userID)
|
||||
token, err := GenerateSessionToken(32) // Use crypto/rand for this
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
CSRFToken, err := GenerateSessionToken(32)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newSessionData := SessionData{
|
||||
UserID: userID,
|
||||
CSRFToken: CSRFToken,
|
||||
ExpiresAt: time.Now().Add(time.Hour),
|
||||
}
|
||||
err = manager.store.Create(token, &newSessionData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newCookie := &http.Cookie{
|
||||
Name: SessionCookieName,
|
||||
Value: token,
|
||||
Path: "/",
|
||||
HttpOnly: true, // Essential: prevents JS access
|
||||
Secure: true, // Set to TRUE in production (HTTPS)
|
||||
SameSite: http.SameSiteLaxMode,
|
||||
MaxAge: 3600, // 1 hour
|
||||
}
|
||||
return newCookie, nil
|
||||
}
|
||||
|
||||
func (manager *SessionManager) GetSession(r *http.Request) (*SessionData, error) {
|
||||
logging.Debug("Validating session from request")
|
||||
cookie, err := r.Cookie(SessionCookieName)
|
||||
if err != nil {
|
||||
return nil, ErrSessionNotFound
|
||||
}
|
||||
token := cookie.Value
|
||||
if token == "" {
|
||||
return nil, ErrSessionNotFound
|
||||
}
|
||||
data, err := manager.store.Get(token)
|
||||
if err != nil {
|
||||
return nil, ErrSessionNotFound
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
Reference in New Issue
Block a user