SigningError с Firebase getSignedUrl () - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь использовать file.getSignedUrl () , чтобы получить URL-адрес для загрузки из Firebase Storage через облачные функции Google (Nodejs).Я получаю эту ошибку в консоли Cloud Functions:

{ SigningError: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account. This may be because the Compute Engine instance does not have the correct permission scopes specified. Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/myapp-cd94d/serviceAccounts/myapp-cd94d@appspot.gserviceaccount.com.
    at SigningError (/user_code/node_modules/@google-cloud/storage/build/src/file.js:58:9)
    at authClient.sign.then.catch.err (/user_code/node_modules/@google-cloud/storage/build/src/file.js:1019:22)
    at process._tickDomainCallback (internal/process/next_tick.js:135:7) name: 'SigningError' }

Я скопировал код из Добавьте Firebase Admin SDK на документацию вашего сервера .У меня есть serviceAccountKey.json в моей папке functions.firebase deploy не дал мне ошибку

Error parsing triggers: Cannot find module 'serviceAccountKey.json'

, поэтому я должен иметь правильный путь к своему serviceAccountKey.json.Я даже сгенерировал новый закрытый ключ, который не решил проблему.У меня есть firebase-admin 6.1.0 и firebase-tools 6.1.0.Вот соответствующие части моего кода:

const admin = require('firebase-admin');
var serviceAccount = require("./myapp-cd94d-firebase-adminsdk-1234x-sEcReT.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://myapp-cd94d.firebaseio.com"
});

...

const config = {
  action: 'read',
    expires: '03-17-2025'
  };

file.getSignedUrl(config).then(function(data) {
    const url = data[0];
    console.log(url);
  })
  .catch(function(error) {
    console.error(error);
  })

Я видел, что Ответ Дуга Стивенсона имеет другой код, но он, кажется, эквивалентен коду в документации.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

В моем случае я включил управление идентификацией и доступом (IAM), URL-адрес следующий:

https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project="YOUR НАИМЕНОВАНИЕ ПРОЕКТА "

0 голосов
/ 17 ноября 2018

Ответ связан с Cloud Identity and Access Management .Сначала перейдите на страницу облачной платформы Google IAM & admin .Вы увидите различные учетные записи .Найдите служебную учетную запись, которая выглядит как myapp-cd99d@appspot.gserviceaccount.com.В колонке Name должно быть написано App Engine default service account.(Если сообщение об ошибке ссылается на другую учетную запись службы, найдите эту учетную запись службы.)

В столбце Role могут отображаться или не отображаться некоторые роли.Если вы получаете сообщение SigningError, в столбце Role отсутствует роль Создатель токена учетной записи службы .Установите флажок слева от myapp-cd99d@appspot.gserviceaccount.com, чтобы выбрать учетную запись службы, а затем щелкните карандашом справа, чтобы отредактировать ее.На следующем экране нажмите +ADD ANOTHER ROLE.Прокрутите вниз до Service Accounts, выберите Service Account Token Creator и сохраните.Теперь вы должны увидеть Service Account Token Creator в столбце Roles для App Engine default service account.Теперь у вас есть разрешение на создание подписанных токенов.

Далее повторите эти шаги и добавьте роль для Storage Object Creator.Это позволит вам запускать getSignedURL().

. Вы можете сохранить альтернативно назначить администратора учетной записи службы и администратора хранилища, которые включают роли Service Account Token Creator и Storage Object Creator соответственно, а также другие роли.

Теперь, если вы вместо этого получили сообщение SingingError, это может быть из-за того, что вы расстраиваете "Дни славы" Брюса Спрингстина.: -)

...