如何通过 REST API 将当前用户从 Angular 应用程序发送到 Firebase 实时数据库规则
How to send current user from Angular app to Firebase realtime database rules through REST API
我有一个小型 Angular 应用程序部署到 Firebase。只有2个用户。用户使用他们的电子邮件地址进行身份验证。我能够在我的 Angular 应用程序中获取用户数据。
在开发阶段,我使用了以下实时数据库规则:
{
"rules": {
".read": true,
".write": true
}
}
当然,我想让整个数据库只对这 2 个用户可读和可写。
我已尝试设置以下规则:
{
"rules": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
不出所料,我收到了 401 错误。
我的问题是,我应该如何从 Angular 应用端点请求中发送 uid?
我试过通过路径参数发送它,例如:
this.http.get(`https://myappname.firebaseio.com/data.json?auth=${uid}`).toPromise();
但是像这样传递登录用户的 uid 是行不通的。我应该用 http headers 发送它吗?如果是,正确的语法应该是什么?
或者我需要发送任何东西吗?也许我只需要一个更好的实时数据库规则?
编辑:
我能够使用身份验证服务的构造函数检索 tokenId。
this.firebaseAuth.authState.subscribe((user: any) => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
user.getIdToken().then((idToken: any) => {
this.idToken = idToken;
});
} else {
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
});
现在,当我调用 API 端点时,我只需将 idToken 添加为路径参数,如下所示:
return this.http.get(`https://myapp.firebaseio.com/data.json?auth=${token}`).toPromise();
实时数据库规则如下所示:
{
"rules": {
".read": "auth !== null",
".write": "auth !== null"
}
}
您使用 Realtime Database REST API 在 Angular 应用程序和 Firebase 实时数据库之间进行交互。
如 doc 中所述,要通过 auth
查询字符串参数向实时数据库 REST API 发送经过身份验证的请求,您需要生成并传递一个 ID令牌.
this.http.get(`https://myappname.firebaseio.com/data.json?auth=<ID_TOKEN>`).toPromise();
要生成此 ID 令牌,您可以
- 按照说明从客户端(您的 Angular 应用程序)检索它 here;
- 或者,使用 Firebase Auth REST API, with the
signInWithPassword
方法(因为您的用户“使用他们的电子邮件地址进行身份验证”)。
请注意,ID 令牌与用户 uid 完全不同。
PS:由于您使用 "auth.uid !== null"
设置规则,您可能对此 SO answer 感兴趣。
我有一个小型 Angular 应用程序部署到 Firebase。只有2个用户。用户使用他们的电子邮件地址进行身份验证。我能够在我的 Angular 应用程序中获取用户数据。
在开发阶段,我使用了以下实时数据库规则:
{
"rules": {
".read": true,
".write": true
}
}
当然,我想让整个数据库只对这 2 个用户可读和可写。
我已尝试设置以下规则:
{
"rules": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
不出所料,我收到了 401 错误。
我的问题是,我应该如何从 Angular 应用端点请求中发送 uid?
我试过通过路径参数发送它,例如:
this.http.get(`https://myappname.firebaseio.com/data.json?auth=${uid}`).toPromise();
但是像这样传递登录用户的 uid 是行不通的。我应该用 http headers 发送它吗?如果是,正确的语法应该是什么?
或者我需要发送任何东西吗?也许我只需要一个更好的实时数据库规则?
编辑:
我能够使用身份验证服务的构造函数检索 tokenId。
this.firebaseAuth.authState.subscribe((user: any) => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
user.getIdToken().then((idToken: any) => {
this.idToken = idToken;
});
} else {
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
});
现在,当我调用 API 端点时,我只需将 idToken 添加为路径参数,如下所示:
return this.http.get(`https://myapp.firebaseio.com/data.json?auth=${token}`).toPromise();
实时数据库规则如下所示:
{
"rules": {
".read": "auth !== null",
".write": "auth !== null"
}
}
您使用 Realtime Database REST API 在 Angular 应用程序和 Firebase 实时数据库之间进行交互。
如 doc 中所述,要通过 auth
查询字符串参数向实时数据库 REST API 发送经过身份验证的请求,您需要生成并传递一个 ID令牌.
this.http.get(`https://myappname.firebaseio.com/data.json?auth=<ID_TOKEN>`).toPromise();
要生成此 ID 令牌,您可以
- 按照说明从客户端(您的 Angular 应用程序)检索它 here;
- 或者,使用 Firebase Auth REST API, with the
signInWithPassword
方法(因为您的用户“使用他们的电子邮件地址进行身份验证”)。
请注意,ID 令牌与用户 uid 完全不同。
PS:由于您使用 "auth.uid !== null"
设置规则,您可能对此 SO answer 感兴趣。