delegate rotation
This commit is contained in:
parent
d1b1b3b5aa
commit
ad55164b75
1 changed files with 26 additions and 2 deletions
|
@ -86,7 +86,7 @@ func (s *SessionStore[T]) New(sessionMaxAge time.Duration, data T) (string, stri
|
||||||
return st, ct, nil
|
return st, ct, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validates the session and CSRF tokens, and returns new rotated tokens and session data.
|
// Validates the session and CSRF tokens, then rotates the tokens if valid.
|
||||||
func (s *SessionStore[T]) Validate(st, ct string) (string, string, T, error) {
|
func (s *SessionStore[T]) Validate(st, ct string) (string, string, T, error) {
|
||||||
var zero T
|
var zero T
|
||||||
|
|
||||||
|
@ -111,11 +111,35 @@ func (s *SessionStore[T]) Validate(st, ct string) (string, string, T, error) {
|
||||||
return "", "", zero, fmt.Errorf("invalid CSRF token")
|
return "", "", zero, fmt.Errorf("invalid CSRF token")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate session tokens
|
return s.RotateTokens(st)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RotateTokens rotates the session and CSRF tokens for a given session token.
|
||||||
|
func (s *SessionStore[T]) RotateTokens(st string) (string, string, T, error) {
|
||||||
|
var zero T
|
||||||
|
|
||||||
|
hst := hash(st)
|
||||||
|
|
||||||
|
s.mu.RLock()
|
||||||
|
sess, ok := s.sessions[hst]
|
||||||
|
s.mu.RUnlock()
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return "", "", zero, fmt.Errorf("invalid session token")
|
||||||
|
}
|
||||||
|
|
||||||
|
if time.Now().After(sess.expires) {
|
||||||
|
s.mu.Lock()
|
||||||
|
delete(s.sessions, hst)
|
||||||
|
s.mu.Unlock()
|
||||||
|
return "", "", zero, fmt.Errorf("session expired")
|
||||||
|
}
|
||||||
|
|
||||||
newSt, err := generateToken(s.tokenLength)
|
newSt, err := generateToken(s.tokenLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", zero, fmt.Errorf("error generating new session token: %w", err)
|
return "", "", zero, fmt.Errorf("error generating new session token: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newCt, err := generateToken(s.tokenLength)
|
newCt, err := generateToken(s.tokenLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", zero, fmt.Errorf("error generating new CSRF token: %w", err)
|
return "", "", zero, fmt.Errorf("error generating new CSRF token: %w", err)
|
||||||
|
|
Loading…
Reference in a new issue