porting - part 4 done

This commit is contained in:
2025-09-07 12:14:19 -07:00
parent 6e4b12afa7
commit ead942b122
12 changed files with 368 additions and 24 deletions

37
garth/client/auth.go Normal file
View File

@@ -0,0 +1,37 @@
package client
import (
"time"
)
// OAuth1Token represents OAuth 1.0a credentials
type OAuth1Token struct {
Token string
TokenSecret string
CreatedAt time.Time
}
// Expired checks if token is expired (OAuth1 tokens typically don't expire but we'll implement for consistency)
func (t *OAuth1Token) Expired() bool {
return false // OAuth1 tokens don't typically expire
}
// OAuth2Token represents OAuth 2.0 credentials
type OAuth2Token struct {
AccessToken string
RefreshToken string
TokenType string
ExpiresIn int
ExpiresAt time.Time
}
// Expired checks if token is expired
func (t *OAuth2Token) Expired() bool {
return time.Now().After(t.ExpiresAt)
}
// RefreshIfNeeded refreshes token if expired (implementation pending)
func (t *OAuth2Token) RefreshIfNeeded(client *Client) error {
// Placeholder for token refresh logic
return nil
}

View File

@@ -52,11 +52,16 @@ func NewClient(domain string) (*Client, error) {
// Login authenticates to Garmin Connect using SSO
func (c *Client) Login(email, password string) error {
ssoClient := sso.NewClient(c.Domain)
oauth2Token, err := ssoClient.Login(email, password)
oauth2Token, mfaContext, err := ssoClient.Login(email, password)
if err != nil {
return fmt.Errorf("SSO login failed: %w", err)
}
// Handle MFA required
if mfaContext != nil {
return fmt.Errorf("MFA required - not implemented yet")
}
c.OAuth2Token = oauth2Token
c.AuthToken = fmt.Sprintf("%s %s", oauth2Token.TokenType, oauth2Token.AccessToken)