A partir de mayo de 2024 GitLab ha dejado de dar soporte a los tokens de acceso sin fecha de expiración, de esta forma el token que veníamos usando desde 2018 ha dejado de funcionar y nos ha generado un grave problema en nuestros plugins para WordPress y en nuestros plugins para WooCommerce que gestionan sus actualizaciones desde nuestro repositorio privado ya que han dejado de conectarse con el viejo token de acceso y tampoco lo hacen haciendo público el repositorio.
El problema es que no podemos dejar configurado un token en el código de los plugin que va a terminar por desaparecer en un plazo máximo de 365, así que hemos tenido que fabricar un pequeño código PHP que se encarga de regenerar la vida útil del nuevo token de acceso utilizando la API de rotación de GitLab.
¿Cómo lo hemos resuelto?
En nuestro sitio web hemos creado un evento programado que se ejecuta cada seis meses, ya que según hemos comprado la rotación genera una fecha máxima de once meses a pesar de indicarle un año. El código PHP que hemos tenido que fabricar es muy similar a este:
Básicamente lo que hace el evento apg_regenera_token es leer el token original que hemos guardado previamente en el fichero fichero_que_contiene_el_token.ext, hace una consulta vía GET para obtener la lista completa de los tokens de acceso que tenemos configurados en GitLab y busca uno cuyo nombre sea Plugins y que esté activo, que es el que nos interesa actualizar, en tu caso debes poner el nombre que hayas utilizado.
Una vez localizado el ID interno de este token genera una nueva consulta vía POST para añadir al token una fecha de expiración de un año, al hacerlo automáticamente se genera un nuevo token que almacenamos de nuevo en fichero_que_contiene_el_token.ext para poder ser utilizado la próxima vez. En caso de que haya ocurrido algún error nos enviará un correo electrónico con la información que ha recepcionado en la primera consulta para poder corregir lo que necesitemos antes de perder la conexión definitivamente.
El token almacenado en el fichero fichero_que_contiene_el_token.ext lo podemos leer siempre que lo necesitemos con el siguiente código PHP:
De esta forma tan sencilla podemos regenerar el token de acceso automáticamente cada seis meses y podemos leerlo tantas veces como necesitemos obteniendo siempre el último token almacenado para garantizarnos el acceso de forma permanente.
¿Y cómo lo utilizo en un producto descargable de WooCommerce?
En nuestro caso los plugins premium se descargan directamente desde el repositorio privado de GitLab. La URL de descarga de los ficheros tienen una estructura similar a esta: https://gitlab.com/api/v4/projects/xxxx/repository/archive.zip/?private_token=yyyy
El problema es que el token privado ahora no es siempre el mismo y necesitamos leerlo desde el fichero que lo almacena, además la URL de descarga que se indica en el producto descargable de WooCommerce tiene que tener una extensión válida como .zip, .pdf, .jpg, .mp3, o similar, pero en ningún caso va a admitir una extensión .php, por ejemplo.
Para solucionar este nuevo problema hemos creado otro código PHP similar a este:
Gracias a este nuevo código podemos indicar una URL de descarga con esta estructura: https://dominio.ext/fichero.zip?plugin=APG-WCES.
Básicamente lo que va a ocurrir al abrir esta URL dinámica es que se va a descargar el fichero ZIP original temporalmente desde el repositorio de GitLab y va a devolver el fichero descargado para facilitar su descarga directa desde el navegador. Hay que recordar que WooCommerce enmascara esta URL dinámica, por lo que el cliente nunca tiene acceso a la misma de forma directa, pero sí tiene acceso a la descarga directa del fichero ZIP.
Conclusión
Tras el problema que ha generado la nueva política de fechas de expiración de los tokens de acceso de GitLab no hemos tenido más remedio que darle una vuelta de tuerca al mismo para encontrar la mejor solución. Gracias al uso de la API de rotación de GitLab y a un poco de ingenio hemos resuelto un problema que en primera instancia nos resultaba bastante complicado.
Esperamos que os resulte útil este código para vuestros propios desarrollos y quedamos a la espera de vuestros comentarios.
Artículos relacionados
Comentarios




