package session import ( "crypto/rand" "encoding/hex" "somehole.com/common/security/signature" ) type SessionId string func NewSessionId() SessionId { b := make([]byte, 8) rand.Read(b) return SessionId(hex.EncodeToString(b)) } type State string func NewState(id SessionId, signer *signature.Keypair) State { sig, err := signer.Sign([]byte(id)) if err != nil { panic(err) } return State(hex.EncodeToString(sig[:])) } type Code string type AccessToken string type RefreshToken string type TokenChoice uint8 const ( TokenChoiceAccess TokenChoice = iota TokenChoiceRefresh ) func (t TokenChoice) String() (out string) { switch t { case TokenChoiceAccess: out = "access_token" case TokenChoiceRefresh: out = "refresh_token" } return } type Session struct { SessionId SessionId State State Code Code AccessToken AccessToken RefreshToken RefreshToken } func NewSession() *Session { id := NewSessionId() return &Session{ SessionId: id, } } func (s *Session) GetToken(choice TokenChoice) (token string) { switch choice { case TokenChoiceAccess: token = string(s.AccessToken) case TokenChoiceRefresh: token = string(s.RefreshToken) } return }