如何将服务器authentication到Firebase?

我有一个在Firebase上编写的应用程序。 安全规则和客户端代码不足以使我的应用程序工作。 我需要连接一个服务器来完成一些任务:

  • 清理使用onDisconnect处理程序进行清理的非规范化数据
  • build立额外的数据索引,超越了我能用查询做的事情

已更新(20160611):如果您在https://firebase.google.com上创build了项目,则从服务器访问数据库的步骤有所不同。; 看到这个答案: 是否仍然可以在Firebase 3中进行令牌的服务器端validation?

有两种方法可以执行此操作:生成服务器身份validation令牌或使用Firebase秘密。

生成服务器令牌您可以使用为“自定义login”创build的相同令牌生成器库生成可从服务器使用的令牌。 然后,您可以从安全规则中提供对此服务器的特殊访问权限。

这里是步骤:

  1. 获取服务器语言/平台的令牌生成器库 。 Node.js和Java服务器往往效果最好。
  2. 使用预先select的uid生成一个标记。 如果您正在编写node.js服务器,则代码可能如下所示:

    var FirebaseTokenGenerator = require("firebase-token-generator"); var tokenGenerator = new FirebaseTokenGenerator("<your-firebase-secret>"); var token = tokenGenerator.createToken( {uid: "my-awesome-server"}, { expires: <far_into_the_future_seconds> }); 
  3. 使用令牌来validation您的客户端。 这里有更多的node.js代码:

     var ref = new Firebase("https://<your-firebase>.firebaseio.com/"); ref.authWithCustomToken(token, function(error, authData) { ... }); 
  4. 如果服务器的语言没有客户端,例如PHP,请将REST请求的标记用作auth参数 。

  5. 更新您的安全规则,授予您的服务器的特殊权限,如uid所标识的,就像这个允许读取整个Firebase的简单规则

     { "rules": { ".write": false, ".read": "auth.uid === 'my-awesome-server'" } } 
  6. 访问所有的数据,做很棒的东西。

优点

  • 这是Firebase官方推荐的方式来validation您的服务器。
  • 您的服务器将遵守validation规则。
  • 服务器只是另一个用户。 您可以使用安全规则来精确访问您的数据。
  • 由于访问是细粒度的,因此服务器中的错误不太可能造成损害,例如删除根节点。

Firebase的秘密

如果您是喜欢生活在边缘的开发人员,并且只需戴上帽子即可使用sudo ,还可以直接使用Firebase秘密进行身份validation。

但严重的是,不要这样做。 这很危险。

理由不这样做

  • 就像盲目使用sudo ,这是非常危险的。
  • 您的服务器将不会尊重您的validation规则。
  • 您的服务器完全读/写您的Firebase的访问权限。 如果它有一个丑陋的错误,它可能会删除或损坏没有业务访问的数据。
  • 你的秘密在更多的地方(可能在出站请求日志等)结束。 如果它冒了出来,你会面临更大的风险。