feat(session): store metadata

This commit is contained in:
Trong Huu Nguyen
2022-06-17 12:00:00 +02:00
parent 402d8b940f
commit debf97efda
6 changed files with 36 additions and 9 deletions

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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) {