【问题标题】:Firestore REST API | How to use firestore rest api with postmanFirestore REST API |如何将firestore rest api与邮递员一起使用
【发布时间】:2021-10-08 09:47:11
【问题描述】:

我目前正在开展一个项目,我必须允许我的 Firestore 的数据库公开可用。我正在使用firebase与firestore进行通信。我试图遵循一些文档,但我并没有真正理解它们。我指的是我在下面看到的链接......

Firestore's Use REST API docs

Firebase Auth REST API

为了更好地解释我的问题,我指的是 YouTube video,它准确地展示了我的目标(尽管 swift 语言代码并不重要),但该教程并没有像预期的那样工作。本教程没有涵盖困扰我的身份验证部分。

我当前的问题是我在点击时无法通过 Firestore 进行身份验证

https://firestore.googleapis.com/v1/projects/my-project-id/databases?key=MY_PROJECT_KEY

当我使用 Postman 访问此 URL 时,我得到了这些结果。

{
    "error": {
        "code": 401,
        "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
        "status": "UNAUTHENTICATED"
    }
}

我还尝试了其他几种带有发布请求的方法,包括单个登录用户的 JWT 令牌作为 HTTP 正文中的令牌字段,但它们也响应为 401。

所以我试图找到我需要提供的 API 密钥。

【问题讨论】:

    标签: firebase google-cloud-platform google-cloud-firestore


    【解决方案1】:

    Firestore REST API documentation中所述:

    对于身份验证,Cloud Firestore REST API 接受 Firebase 身份验证 ID 令牌或 Google Identity OAuth 2.0 令牌。

    您提供的令牌会影响您请求的授权:

    • 使用 Firebase ID 令牌对来自应用用户的请求进行身份验证。对于这些请求,Cloud Firestore 使用 Cloud Firestore 安全规则以确定请求是否被授权。

    • 使用 Google Identity OAuth 2.0 令牌和服务帐户来验证来自您的应用程序的请求,例如 数据库管理。对于这些请求,Cloud Firestore 使用 身份和访问管理 (IAM) 以确定请求是否 授权。


    该文档随后解释了如何获取 Firebase ID 令牌或如何使用服务帐号生成访问令牌。您必须根据您的具体情况决定选择哪种方法(您是否仅通过 REST API 与 Firestore 交互?您是否将通过客户端 SDK 的调用 - 例如对 Firebase Auth 服务 - 与对 API 的调用混合使用?)。


    在您获得 Firebase ID 令牌或 Google Identity OAuth 之后 2.0 令牌,将其作为设置为 Bearer {YOUR_TOKEN}Authorization 标头传递到 Cloud Firestore 端点。


    以下是通过 JS SDK 获取 Firebase ID 令牌,然后构建标头并通过 axios 库调用 Firestore API 端点(runQuery 用于查询集合)的示例:

      const payloadObj = {
        structuredQuery: {
          where: {...},
          orderBy: [
            {
              field: {
                fieldPath: 'name',
              },
              direction: 'ASCENDING',
            },
          ],
          from: [
            {
              collectionId: '...',
            },
          ],
          limit: 200000,
        },
      };
    
      const url =
        'https://firestore.googleapis.com/v1/projects/<your-projecty>/databases/(default)/documents:runQuery';
    
      firebase
        .auth()
        .signInWithEmailAndPassword('test@gmail.com', '.....')
        .then((userCredential) => {
            return firebase
                .auth()
                .currentUser.getIdToken(/* forceRefresh */ true);
            })
        .then((token) => {
            callHeaders = { Authorization: 'Bearer ' + token };
            return axios({
                url: url,
                method: 'post',
                headers: callHeaders,
                data: payloadObj,
            });
        })
    

    【讨论】:

    • 我用邮递员尝试了这种方法,首先检索当前用户使用auth().currentUser.getIdToken(true).then(...) 生成的新令牌,然后在邮递员中添加Authorization: Bearer {token} 并从您的代码中点击网址,我再次得到 401,但消息是:请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。
    • 如果你按照我的回答应该可以。您能否在您的问题中分享请求标头的确切值?另外请注意,默认 DB 的 URL 应包含 (default)'https://firestore.googleapis.com/v1/projects/&lt;your-project&gt;/databases/(default)/...
    • 这是我的邮递员请求的截图:imgur.com/a/5A0eVj5
    • 这行得通,实际上问题是我代表一个用户请求完整的数据库,当我尝试检索与该特定用户相关的信息时,这显然是不允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2017-07-22
    • 1970-01-01
    • 2016-12-04
    • 2016-07-16
    • 2021-05-13
    相关资源
    最近更新 更多