package providers import ( "net/url" ) // GoogleProvider encapsulates Google-specific OIDC logic. type GoogleProvider struct { *BaseProvider } // NewGoogleProvider creates a new instance of the GoogleProvider. func NewGoogleProvider() *GoogleProvider { return &GoogleProvider{ BaseProvider: NewBaseProvider(), } } // GetType returns the provider's type. func (p *GoogleProvider) GetType() ProviderType { return ProviderTypeGoogle } // GetCapabilities returns the specific capabilities of the Google provider. func (p *GoogleProvider) GetCapabilities() ProviderCapabilities { return ProviderCapabilities{ SupportsRefreshTokens: true, // Google DOES support refresh tokens RequiresOfflineAccessScope: false, // Google uses access_type=offline instead RequiresPromptConsent: true, PreferredTokenValidation: "id", } } // BuildAuthParams configures Google-specific authentication parameters. func (p *GoogleProvider) BuildAuthParams(baseParams url.Values, scopes []string) (*AuthParams, error) { baseParams.Set("access_type", "offline") baseParams.Set("prompt", "consent") // Google does not use the ScopeOfflineAccess scope, so we remove it if present. var filteredScopes []string for _, scope := range scopes { if scope != ScopeOfflineAccess { filteredScopes = append(filteredScopes, scope) } } return &AuthParams{ URLValues: baseParams, Scopes: deduplicateScopes(filteredScopes), }, nil } // Google requires specific scopes and client configuration for proper operation. func (p *GoogleProvider) ValidateConfig() error { return p.BaseProvider.ValidateConfig() }