From debf97efda9e297bf74572997d20b1abe497e1bb Mon Sep 17 00:00:00 2001 From: Trong Huu Nguyen Date: Fri, 17 Jun 2022 12:00:00 +0200 Subject: [PATCH] feat(session): store metadata --- pkg/router/session.go | 3 ++- pkg/router/session_fallback.go | 2 +- pkg/router/session_fallback_test.go | 4 ++-- pkg/session/memory_test.go | 3 ++- pkg/session/redis_test.go | 4 ++-- pkg/session/session.go | 29 +++++++++++++++++++++++++++-- 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/pkg/router/session.go b/pkg/router/session.go index e20fe2b..c9603d6 100644 --- a/pkg/router/session.go +++ b/pkg/router/session.go @@ -93,7 +93,8 @@ func (h *Handler) createSession(w http.ResponseWriter, r *http.Request, tokens * return fmt.Errorf("setting session cookie: %w", err) } - sessionData := session.NewData(externalSessionID, tokens, rawTokens.RefreshToken) + sessionMetadata := session.NewMetadata(time.Now().Add(sessionLifetime)) + sessionData := session.NewData(externalSessionID, tokens, rawTokens.RefreshToken, sessionMetadata) encryptedSessionData, err := sessionData.Encrypt(h.Crypter) if err != nil { diff --git a/pkg/router/session_fallback.go b/pkg/router/session_fallback.go index 13640a3..fcb69c6 100644 --- a/pkg/router/session_fallback.go +++ b/pkg/router/session_fallback.go @@ -72,7 +72,7 @@ func (h *Handler) GetSessionFallback(r *http.Request) (*session.Data, error) { return nil, fmt.Errorf("parsing tokens: %w", err) } - return session.NewData(externalSessionID, tokens, ""), nil + return session.NewData(externalSessionID, tokens, "", nil), nil } func (h *Handler) DeleteSessionFallback(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/router/session_fallback_test.go b/pkg/router/session_fallback_test.go index 6632a38..5d849d0 100644 --- a/pkg/router/session_fallback_test.go +++ b/pkg/router/session_fallback_test.go @@ -51,7 +51,7 @@ func TestHandler_SetSessionFallback(t *testing.T) { writer := httptest.NewRecorder() expiresIn := time.Minute tokens := makeTokens(provider) - data := session.NewData("sid", tokens, "") + data := session.NewData("sid", tokens, "", nil) err := h.SetSessionFallback(writer, data, expiresIn) assert.NoError(t, err) @@ -110,7 +110,7 @@ func TestHandler_DeleteSessionFallback(t *testing.T) { func makeRequestWithFallbackCookies(t *testing.T, h *router.Handler, tokens *jwt.Tokens) *http.Request { writer := httptest.NewRecorder() expiresIn := time.Minute - data := session.NewData("sid", tokens, "") + data := session.NewData("sid", tokens, "", nil) err := h.SetSessionFallback(writer, data, expiresIn) assert.NoError(t, err) diff --git a/pkg/session/memory_test.go b/pkg/session/memory_test.go index f1415bd..e7d62ab 100644 --- a/pkg/session/memory_test.go +++ b/pkg/session/memory_test.go @@ -30,7 +30,8 @@ func TestMemory(t *testing.T) { AccessToken: jwt.NewAccessToken("access_token", accessToken), } refreshToken := "some-refresh-token" - data := session.NewData("myid", tokens, refreshToken) + metadata := session.NewMetadata(time.Now().Add(time.Hour)) + data := session.NewData("myid", tokens, refreshToken, metadata) encryptedData, err := data.Encrypt(crypter) assert.NoError(t, err) diff --git a/pkg/session/redis_test.go b/pkg/session/redis_test.go index 7f1239a..d2dea90 100644 --- a/pkg/session/redis_test.go +++ b/pkg/session/redis_test.go @@ -32,8 +32,8 @@ func TestRedis(t *testing.T) { AccessToken: jwt.NewAccessToken("access_token", accessToken), } refreshToken := "some-refresh-token" - - data := session.NewData("myid", tokens, refreshToken) + metadata := session.NewMetadata(time.Now().Add(time.Hour)) + data := session.NewData("myid", tokens, refreshToken, metadata) encryptedData, err := data.Encrypt(crypter) assert.NoError(t, err) diff --git a/pkg/session/session.go b/pkg/session/session.go index 7a30494..a007d7b 100644 --- a/pkg/session/session.go +++ b/pkg/session/session.go @@ -85,16 +85,41 @@ type Data struct { IDToken string `json:"id_token"` RefreshToken string `json:"refresh_token"` Claims jwt.Claims `json:"claims"` + Metadata Metadata `json:"metadata"` } -func NewData(externalSessionID string, tokens *jwt.Tokens, refreshToken string) *Data { - return &Data{ +type Metadata struct { + CreatedAt int64 `json:"created_at"` + RefreshedAt int64 `json:"refreshed_at"` + ExpiresAt int64 `json:"expires_at"` +} + +func NewMetadata(expiresAt time.Time) *Metadata { + return &Metadata{ + CreatedAt: time.Now().Unix(), + RefreshedAt: time.Now().Unix(), + ExpiresAt: expiresAt.Unix(), + } +} + +func (in *Metadata) UpdateRefreshedAt() { + in.RefreshedAt = time.Now().Unix() +} + +func NewData(externalSessionID string, tokens *jwt.Tokens, refreshToken string, metadata *Metadata) *Data { + data := &Data{ ExternalSessionID: externalSessionID, AccessToken: tokens.AccessToken.GetSerialized(), IDToken: tokens.IDToken.GetSerialized(), RefreshToken: refreshToken, Claims: tokens.Claims(), } + + if metadata != nil { + data.Metadata = *metadata + } + + return data } func (in *Data) Encrypt(crypter crypto.Crypter) (*EncryptedData, error) {