From 46dbff053071faa3a5c0d91b6e8ce8e67a3cd197 Mon Sep 17 00:00:00 2001 From: sjc Date: Wed, 7 May 2025 01:19:21 -0400 Subject: [PATCH] Added Remember-Token to Authenticate Renamed Authenticate to Authenticate2 and added remember-me support Created Authenticate as wrapper for Authenticate2 for backwards compat. --- api.go | 1 + sessions.go | 17 ++++++++++++++++- sessions_test.go | 26 ++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/api.go b/api.go index c498e13..03ed7c5 100644 --- a/api.go +++ b/api.go @@ -15,6 +15,7 @@ const ( type TastytradeAPI struct { httpClient *http.Client authToken string + remToken string host string } diff --git a/sessions.go b/sessions.go index 856b6d9..3301652 100644 --- a/sessions.go +++ b/sessions.go @@ -17,6 +17,7 @@ type User struct { type AuthData struct { User User `json:"user"` SessionToken string `json:"session-token"` + RememberToken string `json:"remember-token"` } type AuthResponse struct { @@ -25,11 +26,18 @@ type AuthResponse struct { } // Authenticate authenticates the client with the Tastytrade API -func (api *TastytradeAPI) Authenticate(username, password string) error { +func (api *TastytradeAPI) Authenticate2(username, password string, remember bool) error { + var remStr string + if remember { + remStr = "true" + } else { + remStr = "false" + } authURL := fmt.Sprintf("%s/sessions", api.host) authData := map[string]string{ "login": username, "password": password, + "remember-me": remStr, } authBody, err := json.Marshal(authData) if err != nil { @@ -52,5 +60,12 @@ func (api *TastytradeAPI) Authenticate(username, password string) error { } api.authToken = authResponse.Data.SessionToken + if remember { + api.remToken = authResponse.Data.RememberToken + } return nil } + +func (api *TastytradeAPI) Authenticate(username, password string) error { + return api.Authenticate2(username, password, false) +} diff --git a/sessions_test.go b/sessions_test.go index 8e1b69a..c711b81 100644 --- a/sessions_test.go +++ b/sessions_test.go @@ -22,4 +22,30 @@ func TestAuthenticate(t *testing.T) { if api.authToken != "testtoken" { t.Errorf("expected %s, got %s", "testtoken", api.authToken) } + + if (len(api.remToken) > 0) { + t.Errorf("no remember token expected, got remember token %s", api.remToken) + } +} + +func TestAuthenticate2(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + rw.Write([]byte(`{"context": "test", "data": {"user": {"email": "test@example.com", "username": "testuser", "external-id": "123", "is-confirmed": true}, "session-token": "testtoken", "remember-token": "remember"}}`)) + })) + defer server.Close() + + api := NewTastytradeAPI(server.URL) + err := api.Authenticate2("testuser", "testpassword", true) + + if err != nil { + t.Errorf("expected nil, got %v", err) + } + + if api.authToken != "testtoken" { + t.Errorf("expected %s, got %s", "testtoken", api.authToken) + } + + if (api.remToken != "remember") { + t.Errorf("Expected remember token remember, got remember token %s", api.remToken) + } }