← Todas las entradas

Problema y solución

Concrete CMS tiene API REST: qué puede y qué no puede hacer

Un programador sonriendo en su escritorio, con código en la pantalla y un café junto al teclado.

Concrete CMS trae una API REST en el núcleo, hace más de lo que sugiere su fama, y la forma obvia de conectarse a ella es la equivocada. Las credenciales de cliente —un identificador y un secreto, sin navegador— devuelven un token firmado que lee la web perfectamente y después rechaza cada escritura con un 403. La vía que funciona es aquella en la que apruebas la integración en tu propia web. Todo lo de abajo se encontró instalando Concrete 9.5.5 en una dirección real y manejando su API: cada línea fue una petición y una respuesta.

·

Esto es lo más útil que hemos escrito sobre ninguna plataforma, porque es donde más se separan la documentación y el comportamiento, y porque el arreglo no es un apaño: la vía admitida resulta ser además la mejor.

La concesión que funciona y la que lo parece

Concrete ofrece cuatro tipos de concesión OAuth. Las credenciales de cliente son la elección natural para un producto que habla con una web sin nadie delante, y parecen funcionar: el token se emite, está firmado y lee páginas públicas sin quejarse. Después, cada escritura vuelve con un error de permisos sobre añadir páginas debajo de una página padre, que suena a problema de configuración y no lo es.

El motivo está en el propio middleware de Concrete: solo asocia un usuario a la petición cuando el token lleva un identificador de usuario, y un token de credenciales de cliente no lleva ninguno, porque la entidad de cliente OAuth de Concrete no tiene ningún campo de cuenta de servicio al que atarlo. Así que la petición se ejecuta como invitado, que puede leer páginas públicas y nada más. Eso es Concrete funcionando como está diseñado, no una mala configuración, y no hay forma de arreglarlo tocando permisos. La respuesta admitida es la concesión por código de autorización: el dueño de la web entra en su propio Concrete, aprueba la integración y el token queda atado a él. Sus permisos pasan a ser los del token, ninguna contraseña llega hasta nosotros, y puede retirarlo desde su propio panel.

  1. En el panel de Concrete, entra en Sistema y ajustes → API y enciende la API.
  2. En esa misma pantalla, marca Código de autorización y Token de refresco. Credenciales de cliente no: parecerá que funciona y luego rechazará todos los cambios.
  3. En API → Integraciones, añade una integración con la dirección de retorno que te mostramos, y copia el identificador y el secreto de cliente. El secreto se enseña una sola vez.
  4. Pega los dos. Te mandamos a tu propia web a pulsar Aprobar y te traemos de vuelta.

Dos trampas más pequeñas por el camino. El prefijo de la API es `/ccm/api/1.0`, no `v1`, y confundirlo cuesta una hora de 404 que parecen exactamente la API apagada. Y los permisos hay que pedirlos de forma explícita al solicitar el token: un token emitido sin parámetro de permisos se rechaza en todos los puntos finales con un mensaje sobre que el punto final está fuera de alcance, lo que suena a problema de permisos y en realidad es una petición vacía.

Una página de Concrete no tiene cuerpo

Esta es la parte que lo cambia todo. Una página de Concrete tiene nombre, descripción, tipo y plantilla, y no tiene campo de cuerpo. El contenido vive en bloques dentro de áreas con nombre, así que escribir texto significa añadir un bloque de contenido a un área, que en una página con plantilla suele llamarse Main. Cualquier cosa construida para Concrete que dé por supuesto un campo de cuerpo no va a funcionar, y el fallo parecerá un nombre de campo equivocado.

Y cada escritura de contenido abre un borrador. Añadir un bloque a una página publicada no cambia la página publicada: crea una versión nueva sin aprobar y deja sirviendo la antigua. Con un cambio de título pasa lo mismo. Y leer la página justo después devuelve la versión aprobada, así que una escritura correcta parece no haber hecho nada hasta que pides expresamente la versión reciente. Publicar es otra llamada que aprueba la versión. Eso encaja con la idea de borrador y después publicación mejor que en casi ninguna otra plataforma, y significa que tu trabajo sin publicar lo vemos nosotros y el nuestro lo ves tú, que es el orden correcto.

Qué intentará nuestro adaptador de Concrete

7 de 14, que es el número más bajo de nuestra lista junto con Strapi, y son los que más importan. Las dos mitades de abajo las imprime el adaptador al cargar la página.

Lo que Concrete CMS nos deja pedir

  • Leer el contenido
  • Crear contenido
  • Editar contenido
  • Publicar contenido
  • Gestionar imágenes y archivos
  • Tipos de contenido propios
  • Información del sitio

Lo que Concrete CMS no tiene forma de hacer

  • Programar publicaciones
  • Gestionar categorías y etiquetas
  • Editar la información SEO
  • Gestionar los menús
  • Cambios en lote
  • Gestionar redirecciones
  • Información de administración

Las dos listas las genera el adaptador de esa plataforma al cargar la página, así que son lo que el software intentará y no lo que nos gustaría decir. El trabajo por lotes es la única fila vacía en todas las plataformas: ningún adaptador lo reclama todavía, y la página de automatización lo dice también.

Lo que ejecutamos, en una sola sesión

Concrete 9.5.5 sobre PHP 8.3, en una dirección nuestra. Una página creada, escrita, retitulada, publicada, leída en la web pública y borrada después.

Lo que pedimos Lo que contestó
Preguntarle a la web qué es Concrete 9.5.5, sobre PHP 8.3.35.
Listar páginas y crear una El mapa del sitio volvió de la más nueva a la más vieja, por páginas. La nueva se creó.
Escribir un párrafo en su área Main Se añadió un bloque de contenido, y abrió la versión 2 sin aprobar. La página en vivo siguió igual.
Aprobar esa versión Publicada. La frase que escribimos estaba en la página que recibe un visitante.
Subir un archivo y borrar la página Subido, con su dirección de vuelta. La página desapareció.

Qué no tiene la API de Concrete

Límite honesto: hay un fallo de Concrete que merece nombrarse, porque cualquier cosa construida contra esta API tiene que rodearlo. Una página creada con descripción vuelve con la descripción vacía: la llamada de creación acepta el campo, responde 200 y lo tira, porque el controlador lo guarda bajo una clave distinta de la que espera la función que lo graba. Una segunda llamada justo después sí funciona. Así que nuestro adaptador crea y después actualiza en vez de fiarse de la creación, y la capacidad sigue verificada porque el resultado final es el correcto.

Lo que nos preguntan sobre esto

¿Hace falta un plugin para Concrete?
No. La API de Concrete está en el núcleo: la enciendes, creas una integración y la apruebas en tu propia web. No se instala nada nuestro.
¿Por qué parece que una escritura no hace nada?
Porque ha abierto una versión en borrador y la página publicada ha seguido sirviéndose. Pide la versión reciente en lugar de la aprobada y el cambio está ahí, esperando a que alguien lo apruebe.
¿Puede un asistente cambiar mis menús de Concrete?
No. Concrete construye sus menús según dónde esté cada página en la jerarquía, y su API no tiene forma de mover una página. Esa fila está gris y seguirá gris hasta que Concrete añada una.

Por dónde seguir