Firebase admin.auth (). CreateCustomToken Разрешение Admin SDK обнаруживать учетную запись службы не работает

Я написал следующий код облачной функции и пытаюсь запустить ее на стороне сервера (НЕ на стороне клиента).

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 для получения дополнительных сведений об использовании и устранении неполадок этой функции ».

В документе говорится, что есть три подхода.

  1. Использование JSON-файла служебного аккаунта
  2. Разрешение Admin SDK обнаруживать учетную запись службы
  3. Использование идентификатора сервисного аккаунта

Мне не нравится №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). Я хочу, чтобы этот ответ помог другим людям.


person Satoshi Nakajima    schedule 16.06.2019    source источник
comment
Вам необходимо предоставить дополнительные разрешения учетной записи службы по умолчанию, как описано в дубликате.   -  person Doug Stevenson    schedule 16.06.2019
comment
Большое Вам спасибо. Мне удалось решить эту проблему. Я искал похожие вопросы по stackoverflow, но их так много, и все, что я нашел, касались решения №1.   -  person Satoshi Nakajima    schedule 16.06.2019