У меня развернуто две функции 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
?