AuthenticateRequest sets the appropriate auth header on an HTTP request. Uses Bearer token if available, otherwise falls back to session cookie.
(ctx context.Context, req *http.Request)
| 83 | // AuthenticateRequest sets the appropriate auth header on an HTTP request. |
| 84 | // Uses Bearer token if available, otherwise falls back to session cookie. |
| 85 | func (m *Manager) AuthenticateRequest(ctx context.Context, req *http.Request) error { |
| 86 | if token := os.Getenv("HEY_TOKEN"); token != "" { |
| 87 | req.Header.Set("Authorization", "Bearer "+token) |
| 88 | return nil |
| 89 | } |
| 90 | |
| 91 | m.mu.Lock() |
| 92 | defer m.mu.Unlock() |
| 93 | |
| 94 | creds, err := m.store.Load(m.baseURL) |
| 95 | if err != nil { |
| 96 | return fmt.Errorf("not authenticated: %w", err) |
| 97 | } |
| 98 | |
| 99 | if creds.AccessToken != "" { |
| 100 | // Auto-refresh if needed |
| 101 | if creds.ExpiresAt > 0 && time.Now().Unix() >= creds.ExpiresAt-300 { |
| 102 | if err = m.refreshLocked(ctx, creds); err != nil { |
| 103 | return err |
| 104 | } |
| 105 | creds, err = m.store.Load(m.baseURL) |
| 106 | if err != nil { |
| 107 | return fmt.Errorf("failed to load refreshed credentials: %w", err) |
| 108 | } |
| 109 | } |
| 110 | req.Header.Set("Authorization", "Bearer "+creds.AccessToken) |
| 111 | return nil |
| 112 | } |
| 113 | |
| 114 | if creds.SessionCookie != "" { |
| 115 | req.Header.Set("Cookie", "session_token="+creds.SessionCookie) |
| 116 | return nil |
| 117 | } |
| 118 | |
| 119 | return fmt.Errorf("no access token or session cookie available") |
| 120 | } |
| 121 | |
| 122 | // IsAuthenticated checks if there are valid credentials. |
| 123 | func (m *Manager) IsAuthenticated() bool { |
no test coverage detected