我们有一个小节点应用程序模拟我们将安装在散热器上并写入实时数据库的物联网设备。设备将在数据库的节点上读取/写入与其uid匹配的规则,如下所示:
{
"rules": {
"$userid":{
".read": "auth.uid === $userid",
".write": "auth.uid === $userid"
}
}
我们的想法是,在生产和将它们发送给卖家之前,设备将连接到服务器并获取使用firebase-admin auth createCustomToken函数生成的令牌。对于此示例,我们已手动生成具有固定uid的标记:
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);
});
节点应用程序如下:
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");});
当我们执行应用程序时,一切正常。
现在,当我们让一小时过去并再次执行应用程序时,会出现以下错误:
错误auth:auth / invalid-custom-token - 自定义标记格式为 不正确。请查看文档。
我们理解这是由令牌过期引起的,防止这种情况的唯一方法是让设备连接到数据库或在到期前使用令牌再次登录。但我们遇到的问题是,我们的想法是使用令牌发送设备,并且在设备售出之前可以通过数周和数月,然后再次连接到数据库,此时令牌将无效。
是否有任何解决方法可以避免这种情况?我们一直在考虑使用simpleLogin,但我们没有看到每个设备都有一个假电子邮件和密码登录的重点。
修改
与我们的客户交谈时,他们有一个基于firebase的iot解决方案,其中每个设备都有一个令牌,从2015年开始它就是相同的令牌。当他们进行API REST调用时,他们会使用类似于这样:
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
他们不知道它是如何创建的,因为服务器部分是由另一家公司开发的,因此他们只获得了令牌。他们只知道它永远不会过期,并且每个令牌都标识一个唯一的用户,该用户在数据库上只有该路由上的权限。 ¿这是要走的路还是一些将被丢弃的firebase遗留兼容性?