---
name: OAuthConfig
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type OAuthConfig struct {
      ClientID     string   `json:"client_id"`
      ClientSecret string   `json:"client_secret"`
      AuthURL      string   `json:"auth_url"`
      TokenURL     string   `json:"token_url"`
      RedirectURL  string   `json:"redirect_url"`
      Scopes       []string `json:"scopes"`
  }
description: "Configuracion de un proveedor OAuth2. Contiene credenciales del cliente, endpoints de autorizacion/token, redirect URI y scopes solicitados."
tags: [oauth, oauth2, auth, config, infra]
uses_types: []
file_path: "functions/infra/oauth_config.go"
---

## Ejemplo

```go
google := OAuthConfig{
    ClientID:     os.Getenv("GOOGLE_CLIENT_ID"),
    ClientSecret: os.Getenv("GOOGLE_CLIENT_SECRET"),
    AuthURL:      "https://accounts.google.com/o/oauth2/v2/auth",
    TokenURL:     "https://oauth2.googleapis.com/token",
    RedirectURL:  "http://localhost:8080/callback",
    Scopes:       []string{"openid", "email", "profile"},
}
url := Oauth2AuthURL(google, "random-state-123")
```

## Notas

Tipo producto — agrupa todo lo necesario para los tres flujos OAuth2 soportados (auth URL, code exchange, refresh). ClientSecret nunca debe salir del servidor: Oauth2Exchange y Oauth2Refresh lo envian al TokenURL del proveedor, no al cliente. Scopes se concatenan con espacio al construir la URL (`openid email profile`).
