Files
fn_registry/functions/infra/oauth2_refresh.go
T
egutierrez 1e5dfa5193 feat: oauth2_auth_url (pure), oauth2_exchange, oauth2_refresh
Fase 4 del issue 0010 — cliente OAuth2 sin golang.org/x/oauth2.
- Oauth2AuthURL es pura: solo construye la URL con net/url
- Oauth2Exchange/Refresh hacen POST application/x-www-form-urlencoded
- ExpiresAt calculado como now + expires_in del proveedor
- Refresh conserva el token original si el proveedor no devuelve uno nuevo
- Tests con httptest.NewServer como mock del proveedor
2026-04-18 17:41:42 +02:00

35 lines
1.0 KiB
Go

package infra
import (
"fmt"
"net/url"
)
// Oauth2Refresh renueva un access token OAuth2 usando el refresh token.
// POST al TokenURL con grant_type=refresh_token. Retorna OAuthTokens con
// el nuevo AccessToken (y posiblemente un nuevo RefreshToken segun el proveedor).
func Oauth2Refresh(config OAuthConfig, refreshToken string) (OAuthTokens, error) {
var zero OAuthTokens
if refreshToken == "" {
return zero, fmt.Errorf("oauth2_refresh: refresh_token vacio")
}
if config.TokenURL == "" {
return zero, fmt.Errorf("oauth2_refresh: token_url vacio")
}
form := url.Values{}
form.Set("grant_type", "refresh_token")
form.Set("refresh_token", refreshToken)
form.Set("client_id", config.ClientID)
form.Set("client_secret", config.ClientSecret)
tokens, err := oauth2DoTokenRequest(config.TokenURL, form)
if err != nil {
return zero, fmt.Errorf("oauth2_refresh: %w", err)
}
// Algunos proveedores no devuelven refresh_token al renovar — conservar el original
if tokens.RefreshToken == "" {
tokens.RefreshToken = refreshToken
}
return tokens, nil
}