为什么使用onRequest从firebase函数调用firestore,但使用onCall却不能

时间:2019-10-16 19:40:18

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

我部署了两个Firebase函数,一个使用functions.https.onRequestcompanyRequest),另一个使用functions.https.onCallcompanyCall)。两者的作用完全相同:从firestore检索文档(从完全相同的集合中检索完全相同的文档)。

以下是功能:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

admin.initializeApp(functions.config().firebase);

export const companyRequest = functions.https.onRequest((request, response) => {
  const companyId = "VpOVFo82m9ls3aIK7dra";
  admin
    .firestore()
    .collection("company")
    .doc(companyId)
    .get()
    .then(result => {
      response.send(result.data());
    })
    .catch(error => {
      response.send(error);
    });
});

export const companyCall = functions.https.onCall((data, context) => {
  if (context && context.auth) {
    console.log(
      "AUTH",      
      context.auth.uid,
      context.auth.token.email
    );
  }
  const companyId = "VpOVFo82m9ls3aIK7dra";
  admin
    .firestore()
    .collection("company")
    .doc(companyId)
    .get()
    .then(result => {
      return result.data();
    })
    .catch(error => {
      return error;
    });
});

我用companyRequest呼叫curl,它有效:

> curl https://us-central1-xxxxx.cloudfunctions.net/company
{"name":"Duny Comp."}

我从抖动中呼叫companyCall并失败了(在Firebase,服务器站点上):

Future click() async {
  final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
    functionName: 'companyCall',
  );
  HttpsCallableResult resp = await callable.call(<String, dynamic>{
    'companyId': 'VpOVFo82m9ls3aIK7dra',
  });
  print(resp.data);
}

我为companyCall遇到的错误是:

AUTH 3gvfgYJpk2gIgUpkOLxdkdId uuuu@xxxx.com
ERROR:  Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information

错误似乎很明显,但是为什么使用curl进行未经身份验证的调用会起作用,但是通过flutter进行Firebase身份验证的companyCall确实存在权限问题?在输出中,您甚至可以在flutter应用程序中查看来自最终用户的身份验证信息,以便对他进行身份验证。

问题是,为什么两者之间有区别?像Error: Could not load the default credentials (Firebase function to firestore)这样的提议解决方案也感到很奇怪...

更新:

这与Firebase Cloud Functions中的问题不同:Difference between onRequest and onCall,在这个问题中,我问为什么两种不同方法在安全性方面存在差异。为什么从onCall方法访问集合时,为什么我需要使用管理员帐户进行身份验证才能从onRequest访问同一集合?

0 个答案:

没有答案