如何向 Firebase 验证服务器?
How do you authenticate a server to Firebase?
我有一个用 Firebase 编写的应用程序。安全规则和客户端代码不足以让我的应用正常运行。我需要连接服务器来完成一些任务:
- 清理难以清理的非规范化数据
onDisconnect
处理程序
- 为我的数据构建超出我能力范围的额外索引
和
queries
更新 (20160611):如果您在 https://firebase.google.com, the steps access the database from a server are different. See this answer:
上创建项目
您可以通过两种方式执行此操作:生成服务器身份验证令牌,或使用 Firebase 密码。
生成服务器令牌
您可以使用为自定义登录创建的相同 token generator libraries 生成可从您的服务器使用的令牌。然后,您可以根据您的安全规则提供对此服务器的特殊访问权限。
步骤如下:
- 获取服务器语言/平台的 token generator library。 Node.js 和 Java 服务器往往效果最好。
使用预选的 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> });
使用令牌验证您的客户端。这里有更多 node.js 代码:
var ref = new Firebase("https://<your-firebase>.firebaseio.com/");
ref.authWithCustomToken(token, function(error, authData) {
...
});
如果没有适合您服务器语言的客户端,例如PHP,将您的 REST 请求令牌用作 auth
parameter。
更新您的安全规则以授予您的服务器特殊权限,由 uid 标识,就像这个允许对整个 Firebase 进行读取访问的简单规则
{
"rules": {
".write": false,
".read": "auth.uid === 'my-awesome-server'"
}
}
访问所有数据,做一些很棒的事情。
优势
- 这是 Firebase 官方推荐的验证服务器的方法。
- 您的服务器将遵守验证规则。
- 服务器只是另一个用户。您可以使用安全规则来提供对数据的细粒度访问。
- 由于访问是细粒度的,因此服务器中的错误不太可能造成损坏,例如删除根节点。
Firebase 机密
如果您是那种喜欢生活在边缘的开发人员,并且会在需要时输入 sudo
,您还可以直接使用您的 Firebase 密码进行身份验证。
但是说真的,不要这样做。很危险。
不这样做的原因
- 就像盲目使用
sudo
一样,非常危险。
- 你的
服务器不会遵守您的验证规则。
- 您的服务器已读满
/ 对您的 Firebase 的写入权限。如果它有一个足够丑陋的错误,它
可能会删除或损坏没有业务访问权限的数据。
- 你的
秘密最终出现在更多地方(可能在出站请求日志中,
ETC)。如果它泄露出去,您将面临更多风险。
我有一个用 Firebase 编写的应用程序。安全规则和客户端代码不足以让我的应用正常运行。我需要连接服务器来完成一些任务:
- 清理难以清理的非规范化数据 onDisconnect 处理程序
- 为我的数据构建超出我能力范围的额外索引 和 queries
更新 (20160611):如果您在 https://firebase.google.com, the steps access the database from a server are different. See this answer:
您可以通过两种方式执行此操作:生成服务器身份验证令牌,或使用 Firebase 密码。
生成服务器令牌 您可以使用为自定义登录创建的相同 token generator libraries 生成可从您的服务器使用的令牌。然后,您可以根据您的安全规则提供对此服务器的特殊访问权限。
步骤如下:
- 获取服务器语言/平台的 token generator library。 Node.js 和 Java 服务器往往效果最好。
使用预选的 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> });
使用令牌验证您的客户端。这里有更多 node.js 代码:
var ref = new Firebase("https://<your-firebase>.firebaseio.com/"); ref.authWithCustomToken(token, function(error, authData) { ... });
如果没有适合您服务器语言的客户端,例如PHP,将您的 REST 请求令牌用作
auth
parameter。更新您的安全规则以授予您的服务器特殊权限,由 uid 标识,就像这个允许对整个 Firebase 进行读取访问的简单规则
{ "rules": { ".write": false, ".read": "auth.uid === 'my-awesome-server'" } }
访问所有数据,做一些很棒的事情。
优势
- 这是 Firebase 官方推荐的验证服务器的方法。
- 您的服务器将遵守验证规则。
- 服务器只是另一个用户。您可以使用安全规则来提供对数据的细粒度访问。
- 由于访问是细粒度的,因此服务器中的错误不太可能造成损坏,例如删除根节点。
Firebase 机密
如果您是那种喜欢生活在边缘的开发人员,并且会在需要时输入 sudo
,您还可以直接使用您的 Firebase 密码进行身份验证。
但是说真的,不要这样做。很危险。
不这样做的原因
- 就像盲目使用
sudo
一样,非常危险。 - 你的 服务器不会遵守您的验证规则。
- 您的服务器已读满 / 对您的 Firebase 的写入权限。如果它有一个足够丑陋的错误,它 可能会删除或损坏没有业务访问权限的数据。
- 你的 秘密最终出现在更多地方(可能在出站请求日志中, ETC)。如果它泄露出去,您将面临更多风险。