Files
wonderwall/pkg/session/session.go
Trong Huu Nguyen f73b4605a1 refactor: use encrypted cookie as session fallback
Co-Authored-By: Sindre Rødseth Hansen <sindre.rodseth.hansen@nav.no>
2021-10-04 13:17:04 +02:00

82 lines
1.7 KiB
Go

package session
import (
"context"
"encoding"
"encoding/base64"
"encoding/json"
"github.com/nais/wonderwall/pkg/cryptutil"
"time"
)
type Store interface {
Write(ctx context.Context, key string, value *EncryptedData, expiration time.Duration) error
Read(ctx context.Context, key string) (*EncryptedData, error)
Delete(ctx context.Context, keys ...string) error
}
type EncryptedData struct {
Data string `json:"data"`
}
var _ encoding.BinaryMarshaler = &EncryptedData{}
var _ encoding.BinaryUnmarshaler = &EncryptedData{}
func (in *EncryptedData) MarshalBinary() ([]byte, error) {
return json.Marshal(in)
}
func (in *EncryptedData) UnmarshalBinary(bytes []byte) error {
return json.Unmarshal(bytes, in)
}
func (in *EncryptedData) Decrypt(crypter cryptutil.Crypter) (*Data, error) {
ciphertext, err := base64.StdEncoding.DecodeString(in.Data)
if err != nil {
return nil, err
}
rawData, err := crypter.Decrypt(ciphertext)
if err != nil {
return nil, err
}
var data Data
err = json.Unmarshal(rawData, &data)
if err != nil {
return nil, err
}
return &data, nil
}
type Data struct {
ExternalSessionID string `json:"external_session_id"`
AccessToken string `json:"access_token"`
IDToken string `json:"id_token"`
}
func NewData(externalSessionID, accessToken, idToken string) *Data {
return &Data{
ExternalSessionID: externalSessionID,
AccessToken: accessToken,
IDToken: idToken,
}
}
func (in *Data) Encrypt(crypter cryptutil.Crypter) (*EncryptedData, error) {
bytes, err := json.Marshal(in)
if err != nil {
return nil, err
}
ciphertext, err := crypter.Encrypt(bytes)
if err != nil {
return nil, err
}
return &EncryptedData{
Data: base64.StdEncoding.EncodeToString(ciphertext),
}, nil
}