Estoy creando una aplicación que llama a la API de Twitter desde Cloud Functions. El token de acceso del usuario se almacena en Firebase RTDB.
El problema es que cuando no llamo al método de inicio de sesión Auth de Firebase, la base de datos devuelve una instantánea nula.
Cuando llamo al inicio de sesión de autenticación de Firebase (código a continuación), funciona normalmente
const functions = require("firebase-functions"); const Twitter = require('twitter'); const admin = require('firebase-admin'); const cors = require('cors')({ origin: true }); admin.initializeApp(); exports.tweet = functions.https.onRequest(async (req, res) => { console.log('devs do something', req.body) cors(req, res, () => { if (req.body.uid) { var uid = req.body.uid var promise = admin.database().ref(`auth/`).child(uid).once('value'); return promise.then(snapshot => { var event = snapshot.val() const client = new Twitter({ access_token_key: event.accessToken, access_token_secret: event.secret, consumer_key: "HUYEtFs1NJVGlFqBDq7GJ6HF2",//functions.config().twitter.key, consumer_secret: "ChcSAVwBbd4wLXBSZlIu6nUi6mjsk4b6HqoivuhziP3zAkgGni"//functions.config().twitter.secret //consumer_token_secret: "ChcSAVwBbd4wLXBSZlIu6nUi6mjsk4b6HqoivuhziP3zAkgGni"//functions.config().twitter.secret }); var params = { "tweet_mode": "extended" } client.get('statuses/home_timeline', params, function(error, tweets, response) { if (error) throw error; res.send(tweets) }); }) } else { console.log("No UID provided") } }) }) Este código solo funciona cuando se llama primero a la siguiente función. Si no se llama, entonces admin.database().ref('auth/${uid}') devuelve una instantánea nula.
El siguiente código redirige al usuario para que inicie sesión con Twitter Popup, lo cual es un inconveniente cada vez.
async login(context) { console.log("auth.login()"); return await auth .signInWithPopup(provider) .then(async (result) => { // This gives you a the Twitter OAuth 1.0 Access Token and Secret. // You can use these server side with your app's credentials to access the Twitter API. var credential = result.credential; var accessToken = credential.accessToken; var secret = credential.secret; // The signed-in user info. var user = result.user; db.ref(`auth/${user.uid}/`).update({ accessToken, secret }) return user // ... })¿Existe una conexión entre Firebase Auth y Firebase Admin que desconozco?