---
name: OAuthTokens
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type OAuthTokens struct {
      AccessToken  string `json:"access_token"`
      RefreshToken string `json:"refresh_token"`
      TokenType    string `json:"token_type"`
      ExpiresAt    int64  `json:"expires_at"`
  }
description: "Tokens OAuth2 obtenidos de un flujo de autorizacion. AccessToken es el de corta vida para llamadas a APIs. RefreshToken renueva el access. ExpiresAt es Unix epoch seconds."
tags: [oauth, oauth2, token, infra]
uses_types: []
file_path: "functions/infra/oauth_tokens.go"
---

## Ejemplo

```go
tokens, _ := Oauth2Exchange(googleConfig, code)
if time.Now().Unix() >= tokens.ExpiresAt {
    tokens, _ = Oauth2Refresh(googleConfig, tokens.RefreshToken)
}
req.Header.Set("Authorization", tokens.TokenType + " " + tokens.AccessToken)
```

## Notas

Tipo producto — producto del flujo OAuth2. AccessToken tipicamente expira en 1h. RefreshToken puede durar dias/meses segun el proveedor. TokenType suele ser "Bearer". ExpiresAt se calcula como `time.Now().Unix() + expires_in` al parsear la respuesta del proveedor, asi el consumidor solo compara con `time.Now().Unix()` para saber si renovar.
