Tengo una función invocable que usa la función de nube de firebase. Mi problema con esta función es un error cors al intentar usarla. Actualmente, estoy usando una función como esta.
export const sendWhatsapp = functions.region('europe-west2').https.onCall(async (data, context) => { // verify Firebase Auth ID token if (!context.auth) { return { message: "Authentication Required!", code: 401 }; } const credential = functions.config().twilio; const accountSid = credential?.sid; const authToken = credential?.token; const client = require("twilio")(accountSid, authToken); const numbers = data?.query?.numbers; const text = data?.query?.text; let messages = []; for (let i = 0; i < numbers; i++) { messages.push( client.messages.create({ from: "whatsapp:+", body: `Attention! There is {{1}}.`, to: "whatsapp:+", }) ); } //.then(message => console.log(message)) // .catch(e => console.log(e)); const res = await Promise.all(messages); return { message: res, code: 200 }; });Estoy usando la función HTTP con el método de guardia para verificar si el usuario está autenticado. Intenté usar HTTP a pedido, pero no puedo ver dónde puedo asegurarme de que el usuario esté autenticado.
export const sendWhatsappApi = functions.region('europe-west2').https.onRequest(async (req, res) => { // the same code will be here });En el segundo ejemplo, resolví el problema de cors, pero no pude asegurarme de que el usuario haya iniciado sesión, y en el primer ejemplo, pude asegurarme de que el usuario haya iniciado sesión pero no permitir que la URL de mi aplicación active esta función. Si alguien sabe cómo hacer que el primer ejemplo permita las URL duplicadas que inserté en la sección de dominios autorizados de Firebase, esto me ayudará mucho. Vi algo similar que debería funcionar pero no funcionó aquí . Para que quede claro, estoy solicitando un dominio diferente. Mi aplicación nuxt se ejecuta en la nube y no estoy usando la plataforma de alojamiento Firebase. Funciona cuando uso el alojamiento de firebase, pero quiero usar la ejecución en la nube.
El código del lado del cliente es
const res = await this.$fire.functions.httpsCallable('sendWhatsapp')({ query: { text: this.text }, });El error que estoy recibiendo para el primer ejemplo
La política de CORS bloqueó el acceso para buscar en la 'url de función' desde la 'url de origen' de origen: no hay un encabezado 'Access-Control-Allow-Origin' en el recurso solicitado. Si una respuesta opaca satisface sus necesidades, establezca el modo de la solicitud en 'no-cors' para obtener el recurso con CORS deshabilitado.
Entonces, aparentemente, firebase, cuando encuentra un error interno al ejecutar la función, envía un error cors incluso cuando el error es otra cosa. El error real fue el espacio y el tiempo de espera, pero la consola no mostró el error exacto sino un error cors. Entonces, para resolver esto, agregué memoria y tiempo de espera. No necesité cambiar la seguridad en la pestaña de firebase. Ya estaba configurado.