Yii2 Parche CORS error 401

A veces no queda otra que aplicar parches horribles para solucionar alguna situación que de otra forma o se gasta mucho tiempo o en cambio no hay forma de hacerlo de manera prolija.

Esta vez al parecer se trata de la segunda opción :(.

El error en cuestión

Básicamente ocurre que cuando Yii lanza una excepción con un código de error, por ej 5xx, 4xx en los encabezados de la petición no se retornan los headers correspodientes al CORS.

Lo que da como resultado que el navegador indique un error como el siguiente:

Lo que en mi caso particular, en Angular (asumo que también debe ocurrir con otros frameworks y librerías).

No permite obtener correctamente los códigos de error en los interceptores y cualquier petición.

Lo que es importante para diferenciar los errores retornados de algún endpoint, de las fallas de autenticación.

Ya que si se obtiene un código 401, el comportamiento esperado sería poder dirigir al usuario a la página de login.

Y en caso de otro tipo de error, mostrar un mensaje aclaratorio correspondiente.

Como no se pudo solucionar

Lo primero que intenté fue modificar el archivo de configuración de Nginx para asegurarse que siempre se agreguen los headers CORS, de forma similar a como se hace en el caso de archivos de imágenes y otros documentos estáticos.

Pero no funcionó, ya que el Access-Control-Allow-Origin se sobrescribía con un valor inválido.

Como si se soluciono

Des pues de buscar un tiempo en internet me encontré con un post que lo explicaba y que también hizo la prueba modificando la configuración del server.

Ese post es el siguiente: https://developpaper.com/yii2-restful-401-nginx-axios-cross-domain-settings/

La solución obtenida hasta el momento es editar directamente un archivo del core del framework

Por lo que localizaremos: vendor/yiisoft/yii2/filters/auth/AuthMethod.php

Y en dicho archivo buscar el método: handleFailure

y dejarlo así:

public function handleFailure($response)
    {
        header('Access-Control-Allow-Origin: *'); //no queda otra por el moemnto
        header('Access-Control-Allow-Headers X-Requested-With,Content-Type,x_requested_with');
        throw new UnauthorizedHttpException('Your request was made with invalid credentials.');
    }

Tal vez luego encuentre alguna solución más elegante, pero por ahora es una escusa para inaugurar una nueva etiqueta #CrotingPrograming!

Una vez guardado, llega la hora de la verdad, y haciendo un console.log del error:

Aparece como debe ser, ¡Que hermosa es la vida!

Que habría que hacer?

Sin dudar reportarlo a la policía del Web Development y de ahí insistir a ver si lo solucionan o proponer una mejor solución en los canales oficiales, por que en la última versión al día de la fecha no es algo que se haya arreglado.

Quiero guardar esta chanchada en mi repo, ¿Que hago?

Fácil, agregamos una excepción en el .gitignore

!vendor/yiisoft/yii2/filters/auth/AuthMethod.php

y si aún así se resiste, se puede usar el comando:

git add vendor/yiisoft/yii2/filters/auth/AuthMethod.php -f

Deja un comentario