studio receive notification mismatchsenderid content_available firebase firebase-database firebase-authentication

receive - Lidiar con la caducidad del token en firebase



mismatchsenderid firebase (0)

Bueno, tenemos una aplicación de nodo pequeño que simula un dispositivo de IoT que instalaremos en un radiador y escribiremos en la base de datos en tiempo real. El dispositivo leerá / escribirá en el nodo de la base de datos que coincida con su uid como las reglas establecidas a continuación:

{ "rules": { "$userid":{ ".read": "auth.uid === $userid", ".write": "auth.uid === $userid" } }

Nuestra idea es que cuando se trata de producción y antes de enviarlos a los vendedores, el dispositivo se conecte a un servidor y obtenga un token generado con la función firebase-admin auth createCustomToken. Para este ejemplo, hemos generado manualmente un token con un uid fijo:

var admin = require("firebase-admin"); var uid="F1FF00FF01"; admin.auth().createCustomToken(uid) .then(function(customToken){ console.log("CREATED: " + customToken); }) .catch(function(error){ console.log("Error creating custom token:", error); });

La aplicación de nodo es la siguiente:

var firebase = require("firebase"); var fs = require("fs"); const util = require(''util''); var content = fs.readFileSync("device_data.json"); var jsonContent= JSON.parse(content); var idRD=jsonContent.MACRD; console.log("loaded: " + idRD); var config = {<<Client API Config>>}; firebase.initializeApp(config); var token="<<The generated token with the admin app>>"; firebase.auth().signInWithCustomToken(token).catch(function(error){ var errorCode = error.code; var errorMessage = error.message; console.log("Error auth: " + error.code + " - " + error.message); }); firebase.database().ref("/" + idRD).set(jsonContent,function(){console.log("SET OK");});

Cuando ejecutamos la aplicación, todo funciona bien.

Ahora, cuando dejamos pasar una hora y ejecutamos nuevamente la aplicación, aparece el siguiente error:

Error auth: auth / invalid-custom-token: el formato de token personalizado es incorrecto. Por favor revisa la documentación.

Entendemos que esto se debe a la caducidad del token y que la única forma de evitarlo es mantener el dispositivo conectado a la base de datos o iniciar sesión de nuevo con el token antes de la caducidad. Pero tenemos el problema de que nuestra idea es enviar el dispositivo con el token y pueden pasar semanas y meses antes de que el dispositivo se venda y conectarse de nuevo a la base de datos y en ese momento el token no será válido.

¿Hay alguna solución para evitar esto? Hemos estado pensando en utilizar SimpleLogin en su lugar, pero no vemos el sentido de tener todos los dispositivos con un correo electrónico falso y una contraseña para iniciar sesión.

EDITAR:

Hablamos con uno de nuestros clientes que tiene una solución iot basada en firebase en la que tienen un token para cada dispositivo y ha sido el mismo token desde 2015. Cuando hacen una llamada REST de API, utilizan algo similar a esto:

https://example.firebaseio.com/devices/1234567890ABCDEF/data.json?auth=eyJ0eXAi.OiJKV1.iLCJhbGciOi.JIUzI1NiJ9.eyJleHAiOjIzO.Dk3NjkxODYsInY.OjAsImlhdCI6MT.0Mjk5Nzk4NiwiZCI6e.J1aWQiOiI.Iiwic2VyaWFsbnVt.mVyIjoiMzMzN.M0MzczMjMzND.wQTAwMjgwM.QxIiwiaW.iOiIxIn19.s-AtwzIH.WhVQWCIvdT8YHVa.NoG_KLO.wEBQF.n6mE

No saben cómo se creó porque la parte del servidor fue desarrollada por otra empresa, por lo que solo recibieron los tokens. Lo único que saben es que nunca expira y cada token identifica a un usuario único que solo tiene permisos en esa ruta en la base de datos. ¿Es este el camino a seguir o es una compatibilidad heredada de firebase que se descartará?