Почему я могу вызвать firestore из функции firebase с помощью onRequest, но не при использовании onCall - PullRequest
0 голосов
/ 16 октября 2019

У меня развернуто две функции Firebase, одна использует functions.https.onRequest (companyRequest), а другая использует functions.https.onCall (companyCall). Оба делают одно и то же: извлекают документ из магазина (тот же документ из той же коллекции).

Вот функции:

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, но companyCall с аутентификацией через firebase через флаттер действительно имеет проблемы с разрешениями? В выводе вы даже можете увидеть информацию об аутентификации от конечного пользователя в приложении флаттера, поэтому он аутентифицирован.

Вопрос в том, почему между ними есть разница? Предлагаемые решения, такие как Ошибка: не удалось загрузить учетные данные по умолчанию (функция Firebase в firestore) также чувствую себя очень странно ...

Обновление:

Это не то же самоевопрос, как в Firebase Cloud Functions: Разница между onRequest и onCall , в этом вопросе я спрашиваю, почему существует разница в безопасности, ведет себя по-разному между двумя разными методами. Зачем мне нужно проходить аутентификацию с учетной записью администратора для доступа к той же коллекции из onCall, а мне это не нужно при доступе к коллекции из метода onRequest?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...