Облачное хранилище Firebase: зачем при создании подписанного URL-адреса используется служебная учетная запись для движка приложения?
У меня есть экспресс-сервер, который генерирует подписанный URL-адрес для загрузки файла:
app.get("/signedurl/:filename", async (req, res, next) => {
const { filename } = req.params;
// These options will allow temporary uploading of the file with outgoing
// Content-Type: application/octet-stream header.
const options = {
version: "v4",
action: "write",
expires: Date.now() + 15 * 60 * 1000, // 15 minutes
contentType: "application/octet-stream",
} as GetSignedUrlConfig;
// Get a v4 signed URL for uploading file
const [url] = await admin
.storage()
.bucket()
.file(filename)
.getSignedUrl(options);
res.json({ url });
});
Сервер работает на функции firebase.
Поскольку при тестировании в локальной среде ему нужен файл учетных данных, я развернул его и обратился к "/signedurl/test", чтобы сгенерировать подписанный URL-адрес для тестового файла.
Сначала журнал показал ошибку:
Identity and Access Management (IAM) API has not been used in project 794261759992 before or it is disabled.
, поэтому я включил API.
Затем журнал показал ошибку:
Error: Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/[$my_project_id]/serviceAccounts/[$my_project_id]@appspot.gserviceaccount.com.
Я знаю, как добавить разрешение, но эта учетная запись службы сбила меня с толку.
В консоли Firebase я вижу, что учетная запись службы для firebase похожа на "firebase-adminsdk-xxxx@[$my_project_id].iam.gserviceaccount.com".
И я думал, что учетная запись службы в ошибке предназначена для движка приложений. Но я даже не использую движок приложений.
Итак, почему эта учетная запись службы используется для подписи большого двоичного объекта?