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 }