From f9cb3d75fd2dddd61653f36f567ee67d9a0715be Mon Sep 17 00:00:00 2001 From: sstent Date: Wed, 3 Sep 2025 13:00:21 -0700 Subject: [PATCH] sync --- auth.go | 127 +++++++++++++++++++---------- examples/activities/new_example.go | 57 +++++++++++++ login_page_1756924552.html | Bin 0 -> 3582 bytes login_page_1756925374.html | Bin 0 -> 3584 bytes login_page_1756925380.html | Bin 0 -> 3584 bytes login_page_1756925605.html | Bin 0 -> 3583 bytes login_page_1756925635.html | Bin 0 -> 3582 bytes login_page_1756925872.html | Bin 0 -> 3583 bytes login_page_1756926028.html | Bin 0 -> 3581 bytes login_page_1756926061.html | Bin 0 -> 3581 bytes 10 files changed, 139 insertions(+), 45 deletions(-) create mode 100644 examples/activities/new_example.go create mode 100644 login_page_1756924552.html create mode 100644 login_page_1756925374.html create mode 100644 login_page_1756925380.html create mode 100644 login_page_1756925605.html create mode 100644 login_page_1756925635.html create mode 100644 login_page_1756925872.html create mode 100644 login_page_1756926028.html create mode 100644 login_page_1756926061.html diff --git a/auth.go b/auth.go index e6db6ca..5bdf0db 100644 --- a/auth.go +++ b/auth.go @@ -13,6 +13,8 @@ import ( "regexp" "strings" "time" + + "net/http/cookiejar" // Add cookiejar import ) // GarthAuthenticator implements the Authenticator interface @@ -34,9 +36,18 @@ func NewAuthenticator(opts ClientOptions) Authenticator { }, Proxy: http.ProxyFromEnvironment, } + + // Create cookie jar for session persistence + jar, err := cookiejar.New(nil) + if err != nil { + // Fallback to no cookie jar if creation fails + jar = nil + } + client := &http.Client{ Timeout: opts.Timeout, Transport: transport, + Jar: jar, // Add cookie jar CheckRedirect: func(req *http.Request, via []*http.Request) error { // Allow up to 10 redirects if len(via) >= 10 { @@ -50,7 +61,7 @@ func NewAuthenticator(opts ClientOptions) Authenticator { client: client, tokenURL: opts.TokenURL, storage: opts.Storage, - userAgent: "GarthAuthenticator/1.0", + userAgent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", } // Set authenticator reference in storage if needed @@ -69,15 +80,15 @@ func (a *GarthAuthenticator) Login(ctx context.Context, username, password, mfaT } // Get login parameters including CSRF token - csrf, err := a.fetchLoginParams(ctx) + authToken, tokenType, err := a.fetchLoginParams(ctx) if err != nil { return nil, fmt.Errorf("failed to get login params: %w", err) } - a.csrfToken = csrf // Store CSRF for session + a.csrfToken = authToken // Store for session - // Call authenticate with only the needed parameters - token, err := a.authenticate(ctx, username, password, mfaToken, csrf) + // Call authenticate with the extracted token and its type + token, err := a.authenticate(ctx, username, password, mfaToken, authToken, tokenType) if err != nil { return nil, err } @@ -161,8 +172,8 @@ func (a *GarthAuthenticator) GetClient() *http.Client { return a.client } -// fetchLoginParams retrieves required tokens from Garmin login page -func (a *GarthAuthenticator) fetchLoginParams(ctx context.Context) (csrf string, err error) { +// fetchLoginParams retrieves required tokens from Garmin login page and returns token + type +func (a *GarthAuthenticator) fetchLoginParams(ctx context.Context) (token string, tokenType string, err error) { // Step 1: Set cookies by accessing the embed endpoint embedURL := "https://sso.garmin.com/sso/embed?" + url.Values{ "id": []string{"gauth-widget"}, @@ -172,49 +183,52 @@ func (a *GarthAuthenticator) fetchLoginParams(ctx context.Context) (csrf string, embedReq, err := http.NewRequestWithContext(ctx, "GET", embedURL, nil) if err != nil { - return "", fmt.Errorf("failed to create embed request: %w", err) + return "", "", fmt.Errorf("failed to create embed request: %w", err) } embedReq.Header = a.getEnhancedBrowserHeaders(embedURL) _, err = a.client.Do(embedReq) if err != nil { - return "", fmt.Errorf("embed request failed: %w", err) + return "", "", fmt.Errorf("embed request failed: %w", err) } // Step 2: Get login parameters including CSRF token loginURL := a.buildLoginURL() req, err := http.NewRequestWithContext(ctx, "GET", loginURL, nil) if err != nil { - return "", fmt.Errorf("failed to create login page request: %w", err) + return "", "", fmt.Errorf("failed to create login page request: %w", err) } req.Header = a.getEnhancedBrowserHeaders(loginURL) resp, err := a.client.Do(req) if err != nil { - return "", fmt.Errorf("login page request failed: %w", err) + return "", "", fmt.Errorf("login page request failed: %w", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { - return "", fmt.Errorf("failed to read login page response: %w", err) + return "", "", fmt.Errorf("failed to read login page response: %w", err) } bodyStr := string(body) // Use our robust CSRF token extractor with multiple patterns - csrf, err = getCSRFToken(bodyStr) + token, err = getCSRFToken(bodyStr) if err != nil { - // Write HTML to file for debugging filename := fmt.Sprintf("login_page_%d.html", time.Now().Unix()) if writeErr := os.WriteFile(filename, body, 0644); writeErr == nil { - return "", fmt.Errorf("csrf param not found: %w (HTML saved to %s)", err, filename) + return "", "", fmt.Errorf("authentication token not found: %w (HTML saved to %s)", err, filename) } - return "", fmt.Errorf("csrf param not found: %w (failed to save HTML for debugging)", err) + return "", "", fmt.Errorf("authentication token not found: %w (failed to save HTML for debugging)", err) } - return csrf, nil + // Determine token type (lt or _csrf) + if strings.Contains(token, "LT-") { + return token, "lt", nil + } + return token, "_csrf", nil } // buildLoginURL constructs the complete login URL with parameters @@ -223,13 +237,13 @@ func (a *GarthAuthenticator) buildLoginURL() string { params := url.Values{} params.Set("id", "gauth-widget") params.Set("embedWidget", "true") - params.Set("gauthHost", "https://sso.garmin.com/sso/embed") - params.Set("service", "https://sso.garmin.com/sso/embed") - params.Set("source", "https://sso.garmin.com/sso/embed") - params.Set("redirectAfterAccountLoginUrl", "https://sso.garmin.com/sso/embed") - params.Set("redirectAfterAccountCreationUrl", "https://sso.garmin.com/sso/embed") - params.Set("consumeServiceTicket", "false") // Added from Python implementation - params.Set("generateExtraServiceTicket", "true") // Added from Python implementation + params.Set("gauthHost", "https://sso.garmin.com/sso") + params.Set("service", "https://connect.garmin.com") + params.Set("source", "https://sso.garmin.com/sso") + params.Set("redirectAfterAccountLoginUrl", "https://connect.garmin.com/oauthConfirm") + params.Set("redirectAfterAccountCreationUrl", "https://connect.garmin.com/oauthConfirm") + params.Set("consumeServiceTicket", "false") + params.Set("generateExtraServiceTicket", "true") params.Set("clientId", "GarminConnect") params.Set("locale", "en_US") @@ -253,19 +267,39 @@ func (a *GarthAuthenticator) fetchOAuth1Token(ctx context.Context) (string, erro } defer resp.Body.Close() - // We don't actually need the token value since cookies are handled automatically - // Just need to ensure the request succeeds to set session cookies - return "", nil + // Extract oauth_token from Location header or response body + if location := resp.Header.Get("Location"); location != "" { + if u, err := url.Parse(location); err == nil { + if token := u.Query().Get("oauth_token"); token != "" { + return token, nil + } + } + } + + // Or extract from HTML response + body, _ := io.ReadAll(resp.Body) + tokenPattern := regexp.MustCompile(`oauth_token=([^&\s"]+)`) + matches := tokenPattern.FindStringSubmatch(string(body)) + if len(matches) > 1 { + return matches[1], nil + } + + return "", fmt.Errorf("OAuth1 token not found") } // authenticate performs the authentication flow -func (a *GarthAuthenticator) authenticate(ctx context.Context, username, password, mfaToken, csrf string) (*Token, error) { +func (a *GarthAuthenticator) authenticate(ctx context.Context, username, password, mfaToken, authToken, tokenType string) (*Token, error) { data := url.Values{} data.Set("username", username) data.Set("password", password) data.Set("embed", "true") data.Set("rememberme", "on") - data.Set("_csrf", csrf) + // Use correct token field based on token type + if tokenType == "lt" { + data.Set("lt", authToken) + } else { + data.Set("_csrf", authToken) + } data.Set("_eventId", "submit") data.Set("geolocation", "") data.Set("clientId", "GarminConnect") @@ -450,29 +484,32 @@ func extractParam(pattern, body string) (string, error) { // getCSRFToken extracts the CSRF token from HTML using multiple patterns func getCSRFToken(html string) (string, error) { - // Try different patterns in order of likelihood + // Priority order based on what Garmin actually uses patterns := []string{ - `"csrfToken":"([^"]+)"`, // JSON embedded pattern - `name=["']_csrf["']\s+value=["']([^"']+)["']`, // Flexible quotes - `value=["']([^"']+)["']\s+name=["']_csrf["']`, // Reversed attributes - `name="_csrf"\s+value="([^"]+)"`, // Standard pattern - `id="__csrf"\s+value="([^"]+)"`, // Alternative ID pattern + // 1. Login Ticket (lt) - PRIMARY pattern used by Garmin + `name="lt"\s+value="([^"]+)"`, + `name="lt"\s+type="hidden"\s+value="([^"]+)"`, + `]*name="lt"[^>]*value="([^"]+)"[^>]*>`, + + // 2. CSRF tokens (backup patterns) + `name="_csrf"\s+value="([^"]+)"`, + `"csrfToken":"([^"]+)"`, + + // 3. Other possible patterns + `name=["']_csrf["']\s+value=["']([^"']+)["']`, + `value=["']([^"']+)["']\s+name=["']_csrf["']`, + `id="__csrf"\s+value="([^"]+)"`, } for _, pattern := range patterns { - token, err := extractParam(pattern, html) - if err == nil { - return token, nil + re := regexp.MustCompile(pattern) + matches := re.FindStringSubmatch(html) + if len(matches) > 1 { + return matches[1], nil } } - // Try to extract from JSON structure - token, err := extractFromJSON(html) - if err == nil { - return token, nil - } - - return "", errors.New("all CSRF extraction methods failed") + return "", errors.New("no authentication token found") } // extractFromJSON tries to find the CSRF token in a JSON structure diff --git a/examples/activities/new_example.go b/examples/activities/new_example.go new file mode 100644 index 0000000..e161311 --- /dev/null +++ b/examples/activities/new_example.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "time" + + "github.com/joho/godotenv" + "github.com/sstent/go-garth" +) + +func main() { + // Load environment variables + if err := godotenv.Load(); err != nil { + log.Println("Note: Using system environment variables (no .env file found)") + } + + // Get credentials + username := os.Getenv("GARMIN_USERNAME") + password := os.Getenv("GARMIN_PASSWORD") + mfaToken := os.Getenv("GARMIN_MFA_TOKEN") + if username == "" || password == "" { + log.Fatal("GARMIN_USERNAME or GARMIN_PASSWORD not set in environment") + } + + // Create client + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + client, err := garth.NewGarminClient(ctx, username, password, mfaToken) + if err != nil { + log.Fatalf("Failed to create client: %v", err) + } + + // Get profile + profile, err := client.Profile.Get(ctx) + if err != nil { + log.Fatalf("Failed to get profile: %v", err) + } + log.Printf("User Profile: %s %s (%s)", profile.FirstName, profile.LastName, profile.UserID) + + // List activities + activities, err := client.Activities.List(ctx, garth.ActivityListOptions{Limit: 5}) + if err != nil { + log.Fatalf("Failed to get activities: %v", err) + } + + log.Println("Recent Activities:") + for _, activity := range activities { + fmt.Printf("- %s: %s (%s)\n", + activity.StartTime.Format("2006-01-02"), + activity.Name, + activity.Type) + } +} diff --git a/login_page_1756924552.html b/login_page_1756924552.html new file mode 100644 index 0000000000000000000000000000000000000000..8b98a0261d9393ea79c5303b16f92084ecd839fd GIT binary patch literal 3582 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 E0|B@S=Kufz literal 0 HcmV?d00001 diff --git a/login_page_1756925374.html b/login_page_1756925374.html new file mode 100644 index 0000000000000000000000000000000000000000..42a3f3d29ec83c28c28d530cbd548ccfa9a63495 GIT binary patch literal 3584 zcmV+b4*&6E00652K>qh_`~PqF`P$}QOuM8l(_nEidM5N7(K~tS<$k|upg3iy=& zf2~&`qa+F!RpSVJW!X9#ZMx&5}tK0AQj>3@;&oLcl-G-sN%($(|XD zE@mDJVuNBi#)R!O9Nr&$k2n!N2o65pq~q%qd|k%KGaLhX(M~vtll$q@`s)KsOSebm zM8cfV3Z_LN|5ry(Q-Sv&g*qJd_ghXPYju=Z8{JP!w+|C*?^=ykv(ahv2xLw`bKK#H zL!wEwT8YB`#yEE&(WIJ+kW7Xx#xXVk$+f;&Ly-BRcGwS_4)cY%P~jWW^R}BqGP#Yy zuZ&4F>E!Jfus5OfT&q-y#Hp$6s8%WH~on~*Nd_^9%a!4sPCA?@NVs9qt(cfxBg$5 z$le(tJEYE-@lI_v8?D6*&ROA-J-YO;g?6LQk|vugjrKqQ07quPU;^sn+6af=@f~7N zrIcgO9Onmm`T;SJ*Vos`TK)R^icb0N;woJFE06D)$%R^d@I$|rjYg}NXl2VB=kq<_ zvq%o;;*?2?ex3~T9r8Z~&(Ourlv}POW2M`F(bg?d=P5+vrENx5;<|(jAwm7<<)sm z9GjuzJGz4Q*yuzsxe=NAs^(fbqoqUxsWz}POmR?n0_!n>>8y=VS~M2K zU=0gr6?3M-LcubOHFX+vdjt})G=etpL#RXCF|a!XmxC#l_h)I#6H*`G9df2Ji5&Q| z1T$*QxYTm1zj$&-Kv=NofLS27zt$5{2dm*6R+o{?AqWTQzdX4kut$R-;+k8^v4gY> z-WGcMYdxWLpm)^g5P~q5P4<{0D`+rp%9cCpj8K`^sBcr(YvNiyrXCqZ5%D44OM7jd zVmZ19aAR!q8)!#}o2-a#Nu=N@%-(cFe7K4sX!`Jx$C_juQlTfXyeaobWPMk;5V-b5 zTUqN-Au^^sg&Uycmf!}`Bm%{UN=i_1Ptz(DSuqw<=|@ks2Ryw>Nw#^dy%69EwYRj^ zUI=5)+S?^-?S(TX)*iZR?S;Z!ywz<_Yprf;^@pkD(HS;_Vyav#&s0>030`Y2-jmu( zT5B(!SFH9@5SGEET0xMhcqQQkL{a7Q0lONiW9YqBUQ~@y{D&9Xi zgJmww|8i`V2X5J!DGzui3*{2jV4Tdz``88B5{gggZ>f#U9YqOOHf(YLyTotpk6+yI z&EBy>e8=~=wS8*;bN}~X_CI+#9opMo`=In}E{TUfo8F?Q>3Z7P!LZB5Dl`6DIs8-Rg-yj?l&GF^w>s;rBR;XOO z;l%*8X;1T2rP`zCpMWgCZmAaz;PkRJUab2rZ1BO`&1oKpzvM981TdV>g z_54x)=D)R?zn!mPEl$y@mFW?tRIT6v+SKxBt5FwhU8G(sw(F{K-U-*&u3Mzk$73E; z-20$S-(hsr1YUtlOxU#>GJ-CnA$#!rk1DZD9e+bIVgx%Xnjcbul0z@=TPw5zQ%ba9 z7!u-ZOlst}vH_hEKMZum9$}o5`Ue&h004$Ts5J5WqaM(0up@wDz4E-Qga#87M_gx{ zyPKqS*l&gLlN$Yd059i0#BmI?lVN?SpRovi=C{q`LwITtv4>DdOcgH(G~_(A==!I^ z;|(Nlyvb^o)D&I`#Yghcb@~mESCZ+K;D?AyWQ*C4@K53P3z4QjggOv^Ci5Hi#}GxZ zRJJsD(*C?~lL&g`r$VYt-iLI&dwo)2Y>ecoi60)B^w7?Ztd?tajc!(!mkpMft$wNZ zkZ4fGxB`!9!)TIwqz4*@>c4l|)(JaPmi_4Q5&g3ebSZwHUP0;}IuLqz(@t@Gf1 z!>EY9rC^9I1Ow77G{Ex7KLE4-Y?A~5Jm)ov;$dE{cg&a8rQBXk)D9 z+RTVK)(Qhu*3-q^X7Zx5YplbwtLmyZ#}Y?MooG_86g#7e@MCDD!p}p$riI>IQYVLJ z4d7H$&J9{Suma`Z7hGT>Qh^-Y9u=GrPE0wt+6+U@0Swl}-xbV)LB_R`?{yUVFAPe} zc!afKS!|Lz(H!0dDS(%Andt%{)@v_-hRPDcD(b)@I-d@=N3dv)XhQfCsgy{JW76u( z(`o2%8m>#x$H0Iyb3g-`!FSl(zm1=q`A-6Szs(RS=n9fG5Db#L{BmQ950B3|GWLL2 zB!eyWq*ZlfCWU)Pn=^^13QZ^nHxpMjD`m1=i)owIf%T}k~?Dc!|Mt{*AG^W$xyfqlk zR{cS5wix#N-Ck?eoi&%uMrSze%o?rMwAY!>rmaqQ+HWoAgZ^Ty zYpW$_1mx!6wrw_FpEyKURX!~!!3hXQrWO2fG{3ui#d<2vl|2M24gW1M2kqAe;NnQ_ z?(S0%w)s1~bjU#^ZdtyEG5gr1#VxBya~5eHR~U?H0^O)ME*6<3qTI}!s9VA8bd?S- zvtw6IUh84;C(H0r{m_hi{Sp>=x``i>rrGoTakW~>!mWwavrHoEqwq5veg%9j>oUyuJ&rVjw@Ko6Vn(PmAr-a#&V0gjkb?W7uc-L#PAwXD+P6|4^pm0RTogJ_cQ&`XL<7^qGz*%(M>FlMIZ(9wTex%gu}-~N)7j;rI#>gXc}hXCC3{os&z z{>PCS*u^ZI;=ogLMt*)elO;B*lxbs;db_YS9`8uLmZhA9(&>-+;W>uKq*r{g?RLKU zJvsi~y7@k3;}0{U!~U?}fIVcK)m%~D(Re~|4V-{MI#578{3X)7j(^`^Xh6`C+FJ_}R%cGo43m8eq@zgSO zFM8t3o1}YWocjMZ{+k$c!7+bK#=Brm+`n8zsp&{jC1RZLeFIFN3i>2wh{Ty~Y1x<_NVr-#N=X%$Q#3}jeLE4Z3ad)#UM zPK^&BQjbc_xKJ6riW3Ay(nD+uWFaHx*+&@qGVsxm^57F4p|3 G`>F$r`00B9 literal 0 HcmV?d00001 diff --git a/login_page_1756925380.html b/login_page_1756925380.html new file mode 100644 index 0000000000000000000000000000000000000000..63c94a61f0359d733111536bad475253e57c2cdb GIT binary patch literal 3584 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 G`>F#|y7t`w literal 0 HcmV?d00001 diff --git a/login_page_1756925605.html b/login_page_1756925605.html new file mode 100644 index 0000000000000000000000000000000000000000..39a0703eb1b3176d056a1c82744ed9cca72ad227 GIT binary patch literal 3583 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 literal 0 HcmV?d00001 diff --git a/login_page_1756925872.html b/login_page_1756925872.html new file mode 100644 index 0000000000000000000000000000000000000000..162864fca4f9b18524e2f7f078f958a5d7e4ba8a GIT binary patch literal 3583 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 F0|T_5@{9lg literal 0 HcmV?d00001 diff --git a/login_page_1756926028.html b/login_page_1756926028.html new file mode 100644 index 0000000000000000000000000000000000000000..1f386674c805f4630b0e82a09d9ea2f93eda7d0b GIT binary patch literal 3581 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 D3?1qS literal 0 HcmV?d00001 diff --git a/login_page_1756926061.html b/login_page_1756926061.html new file mode 100644 index 0000000000000000000000000000000000000000..1e4f9669ea960e4de87b7a9ad9f4f258fb91c0c7 GIT binary patch literal 3581 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 DT{iVF literal 0 HcmV?d00001