La causa más habitual es de las que dan rabia: la clave está copiada a medias. Son cadenas larguísimas y al seleccionarlas con el ratón es fácil dejarse el final, o arrastrar un espacio o un salto de línea al pegarlas. Supabase la recibe distinta y la rechaza sin más explicación.
La segunda es tener claves y proyecto cruzados. Pasa mucho después de duplicar un proyecto o de crear uno nuevo para producción: la dirección apunta a un proyecto y la clave es del otro. Cada clave solo vale para su proyecto.
Las otras tres: que la clave se regenerara en el panel y tu app siga usando la vieja; que estés usando una clave del formato antiguo después de haber migrado el proyecto al nuevo sistema de claves; o que la variable de entorno llegue vacía y la app esté mandando literalmente la palabra undefined como si fuera la clave.
Y hay una quinta que conviene mirar antes que ninguna: que al copiar cogieras la clave que no era. Si en el código de tu app acabó la service_role en vez de la pública, no tienes un error de configuración, tienes la llave maestra de tu base de datos publicada en internet. El análisis gratuito de arriba te lo dice en treinta segundos, y merece la pena descartarlo antes de seguir.