Contexto:
Mi aplicación utiliza VoIP mediante TwiML, almaceno registros de llamadas y datos adicionales en Firebase. Cuando se crea una llamada, Twilio es un punto central donde se crea/cancela la llamada. Por esta razón, cuando hago una llamada utilizo Firebase para crear una entrada de llamada en Firebase.
Busqué alguna documentación en línea para este problema, soporte o problemas similares, pero se quedó corto. El asunto es bastante simple:
Salida de registro:
Veo salida de registro hasta este mensaje:
obteniendo el perfil de
entonces recibe este error:
Advertencia de rechazo de promesa no controlada: rechazo de promesa no controlada: error: no se pudieron cargar las credenciales predeterminadas. Vaya a https://cloud.google.com/docs/authentication/getting-started para obtener más información. en GoogleAuth.getApplicationDefaultAsync (/var/task/node_modules/google-auth-library/build/src/auth/googleauth.js:180:19) en processTicksAndRejections (internal/process/task_queues.js:97:5) en async GoogleAuth .getClient (/var/task/node_modules/google-auth-library/build/src/auth/goo...
Código de la aplicación TwiML similar a las funciones de Firebase :
const AccessToken = require('twilio').jwt.AccessToken; const VoiceGrant = AccessToken.VoiceGrant; const VoiceResponse = require('twilio').twiml.VoiceResponse; // Import the functions you need from the SDKs you need const firebase = require("firebase-admin") const firebaseConfig = { apiKey: "", authDomain: "", databaseURL: "", projectId: "", storageBucket: "", messagingSenderId: "", appId: "", measurementId: "" }; // Initialize Firebase console.log("initializing firebase") const app = firebase.initializeApp(firebaseConfig); exports.handler = async function(context, event, callback) { console.log("Running make-call") const from = event.From; let to = event.to; //... console.log("getting profile from") // exception is thrown at this line below var callerProfileSnap = await firebase.firestore(app).collection("profiles").doc(from).get(); // originally had this, but attempted loading the app manually as "credentials" couldn't be loaded made me think this might be an issue // var callerProfileSnap = await firebase.firestore().collection("profiles").doc(from).get(); // ... continuation of code var voiceResponse; callback(null, voiceResponse); }¿Alguna idea de qué puede causar esto/por qué ocurre esto? No encontrar mucho en el camino de las soluciones en línea
La solución fue simple, provocada por un descuido.
Twilio antepone automáticamente "cliente:" al campo event.From . Este fue un intento de encontrar un client:abcd1234... en firestore que no existía.
Sin embargo, el error fue engañoso, ya que no tenía nada que ver con credenciales incorrectas, sino que, de hecho, era un documento de Firestore que faltaba.
Soluciones posibles:
Compruebe si event.From contiene "cliente:", si es así, llame a .split(":")[1] para obtener el ID o la última parte del parámetro From .
payload .por ejemplo, agregar parámetros personalizados como:
customParams: { "hello": "world", "another": "entry" }entonces estará disponible en la carga útil de esta manera:
payload.hellopayload.another