问题 如何通过HTTP REST API访问我的Firebase数据库?


谢谢 这个答案 我可以通过HTTP REST API和电子邮件/密码连接到Firebase 3。使用此API登录会返回用于访问Firebase数据库的访问令牌。此访问令牌在1小时后到期。登录后还会返回刷新令牌,我可以使用它来刷新访问令牌。这是我正在做的具体事情:

方法:

POST

网址:

https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=<my-firebase-api-key>

有效载荷:

{
    email: "<email>",
    password: "<password>",
    returnSecureToken: true
}

响应:

{
    "kind": "identitytoolkit#VerifyPasswordResponse",
    "localId": "<firebase-user-id>", // Use this to uniquely identify users
    "email": "<email>",
    "displayName": "",
    "idToken": "<provider-id-token>", // Use this as the auth token in database requests
    "registered": true,
    "refreshToken": "<refresh-token>",
    "expiresIn": "3600"
}

在刷新我的访问令牌的情况下:

网址:

https://securetoken.googleapis.com/v1/token?key=<my-firebase-api-key>

有效载荷:

{
    grant_type: "refresh_token",
    refresh_token: "<refresh-token>"
}

响应:

{
  "access_token": "<access-token>",
  "expires_in": "3600",
  "token_type": "Bearer",
  "refresh_token": "<refresh-token>",
  "id_token": "<id-token>",
  "user_id": "<user-id>",
  "project_id": "<project-id>"
}

如果我有访问令牌,如何通过HTTP REST API访问我的数据库?


4630
2017-11-10 05:45


起源



答案:


所以在与技术支持沟通后,这是我的答案:

在您的数据库规则中,包含与您正在执行的操作兼容的类似内容:

{
"rules": {
"users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid",
".read": "$user_id === auth.uid"
}
    }
  } 
}

在您的数据库中,创建一个 users 表,并在其中,创建一个名称为您的表 <user-id> 您正在使用的身份验证电子邮件/密码帐户。在该表中是您可以通过您的信息访问的信息 access-key

然后发送这样的请求:

https://samplechat.firebaseio-demo.com/users/<user-id>.json?auth=<access-key>

哪里 access-key 是可以被称为的关键 idTokenid_Token, 要么 access_key 来自Google的JSON回复。


10
2017-11-12 20:05



这是我得到的最佳答案。 Firebase文档非常混乱和混乱!他们甚至没有在REST文档中的任何地方谈论idToken。真是太遗憾了。非常感谢你。 - Richeek
嗨,我试图允许一些json文件公开可用而其他人没有。我这样做了 {"rules": {"publicjson": {".read": true, ".write": false}, ".read": "auth != null", ".write": false}}。我没有问题访问 publicjson。但是,我无法访问任何其他json ".read": "auth != null" 规则。我正在尝试邮递员做一个 GET 要求与 Authorization: Bearer xxx 但没有运气。你对此有所了解吗?这个想法只是将访问密钥存储在应用程序中并在请求中使用。无需用户表。谢谢 - Edison Spencer
@Richeek你知道我上面提到的什么吗? ^^^谢谢 - Edison Spencer
@EdisonSpencer如果您只想拥有一种管理员用户,那么您需要做的是1.从firebase控制台创建一个管理员用户(使用一些电子邮件和密码组合)2。注意其UID并将您的读取权限更改为auth .uid =='<add-uid>'3。从客户端使用电子邮件和密码来登录firebase。请注意,如果您使用REST进行登录,那么您的登录URL就是以下形式(googleapis.com/identitytoolkit/v3/relyingparty/...)。可能更好的是创建一个单独的问题,以便其他人也可以利用! - Richeek
@Richeek感谢关于为获取令牌而创建的用户的提示。我不想创建任何类型的用户。我只是希望在Firebase上托管一些信息,并且只要你有一个令牌就可以公开使用它,以便向这些JSON发出GET请求。否则它将是未经授权的。但我认为我可以创建一个用户并使用该应用程序发送它的令牌(?) - Edison Spencer


答案:


所以在与技术支持沟通后,这是我的答案:

在您的数据库规则中,包含与您正在执行的操作兼容的类似内容:

{
"rules": {
"users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid",
".read": "$user_id === auth.uid"
}
    }
  } 
}

在您的数据库中,创建一个 users 表,并在其中,创建一个名称为您的表 <user-id> 您正在使用的身份验证电子邮件/密码帐户。在该表中是您可以通过您的信息访问的信息 access-key

然后发送这样的请求:

https://samplechat.firebaseio-demo.com/users/<user-id>.json?auth=<access-key>

哪里 access-key 是可以被称为的关键 idTokenid_Token, 要么 access_key 来自Google的JSON回复。


10
2017-11-12 20:05



这是我得到的最佳答案。 Firebase文档非常混乱和混乱!他们甚至没有在REST文档中的任何地方谈论idToken。真是太遗憾了。非常感谢你。 - Richeek
嗨,我试图允许一些json文件公开可用而其他人没有。我这样做了 {"rules": {"publicjson": {".read": true, ".write": false}, ".read": "auth != null", ".write": false}}。我没有问题访问 publicjson。但是,我无法访问任何其他json ".read": "auth != null" 规则。我正在尝试邮递员做一个 GET 要求与 Authorization: Bearer xxx 但没有运气。你对此有所了解吗?这个想法只是将访问密钥存储在应用程序中并在请求中使用。无需用户表。谢谢 - Edison Spencer
@Richeek你知道我上面提到的什么吗? ^^^谢谢 - Edison Spencer
@EdisonSpencer如果您只想拥有一种管理员用户,那么您需要做的是1.从firebase控制台创建一个管理员用户(使用一些电子邮件和密码组合)2。注意其UID并将您的读取权限更改为auth .uid =='<add-uid>'3。从客户端使用电子邮件和密码来登录firebase。请注意,如果您使用REST进行登录,那么您的登录URL就是以下形式(googleapis.com/identitytoolkit/v3/relyingparty/...)。可能更好的是创建一个单独的问题,以便其他人也可以利用! - Richeek
@Richeek感谢关于为获取令牌而创建的用户的提示。我不想创建任何类型的用户。我只是希望在Firebase上托管一些信息,并且只要你有一个令牌就可以公开使用它,以便向这些JSON发出GET请求。否则它将是未经授权的。但我认为我可以创建一个用户并使用该应用程序发送它的令牌(?) - Edison Spencer