Я написал следующий код облачной функции и пытаюсь запустить ее на стороне сервера (НЕ на стороне клиента).
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
export const getJWT = functions.https.onCall(async (data, context) => {
if (context.auth) {
const token = await admin.auth().createCustomToken(context.auth.uid);
return { token: token }
}
return { token: null };
});
Однако он терпит неудачу с этой печально известной ошибкой.
«Необработанная ошибка {Ошибка: разрешение iam.serviceAccounts.signBlob требуется для выполнения этой операции в сервисных аккаунтах projects/-/serviceAccounts/[email protected] .; см. https://firebase.google.com/docs/auth/admin/create-custom-tokens для получения дополнительных сведений об использовании и устранении неполадок этой функции ».
В документе говорится, что есть три подхода.
- Использование JSON-файла служебного аккаунта
- Разрешение Admin SDK обнаруживать учетную запись службы
- Использование идентификатора сервисного аккаунта
Мне не нравится №1, потому что он очень подвержен ошибкам. Поэтому я пытаюсь сделать №2, просто вызвав admin.initializeApp (), как предлагают документы («Чтобы использовать эти методы подписи, инициализируйте SDK с учетными данными по умолчанию для приложения Google и не указывайте строку идентификатора учетной записи службы. ").
Почему не работает? Я что-то упускаю?
Я пытаюсь запустить свой код на стороне сервера (а не на эмуляторе). На самом деле нет смысла использовать подход №1, и я предпочитаю использовать метод №2.
ДОБАВЛЕНО: Вот решение!
Поскольку очень сложно понять, что именно вам нужно делать (даже после прочтения ответа на дубликат), я опишу пошаговую инструкцию.
From the Firebase console,
(1) open the setting,
(2) select Service account tab,
(3) click "Manage service account permissions"
notice that "App Engine default service account" is listed
(4) Click the "IAM" on the side bar
(5) Find the "App Engine default service account" and click the Edit button
(6) Click "+ Add Another Role"
(7) Select "Service Account Token Creator" and Save
Самое главное, вам вообще не нужно обрабатывать опасный файл закрытого ключа, пока вы запускаете этот код на стороне сервера. Вы можете оставить "admin.initializeApp ();" как есть.
Я потратил много времени на эту проблему (включая чтение аналогичных вопросов в stackoverflow). Я хочу, чтобы этот ответ помог другим людям.