Почему мое приложение Firebase не подключается к Google Secret Manager?

Не могу понять, почему продолжает получать ошибку: Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.

firebase login из моей командной строки возвращает, что я уже вошел в систему и настроил [email protected] в качестве секретного аксессора диспетчера секретов на панели администратора GCP IAM в том же проекте.

Вот код, который я использую:

const { SecretManagerServiceClient } = require("@google-cloud/secret-manager");
const client = new SecretManagerServiceClient();

const gcpSecretsLoader = async (secretName: string) => {
  try {
    const secret = await client.accessSecretVersion({
      name: `projects/my-app/secrets/${secretName}/versions/latest`,
    });
    const payload = secret.payload.data.toString("utf8");
    console.info(`Payload: ${payload}`);
  } catch (err) {
    console.log(err);
  }
};

gcpSecretsLoader("CLIENT_ID"); // CLIENT_ID matched a secret name within the secret manager

person mpc75    schedule 17.05.2020    source источник
comment
Где вы запускаете этот код? На локальном ноутбуке или на базе firebase?   -  person sethvargo    schedule 18.05.2020
comment
Если вы запускаете этот код локально, как вы указываете, что ваш код должен использовать указанную учетную запись службы? Либо установите переменную среды GOOGLE_APPLICATION_CREDENTIALS, чтобы она указывала на файл ключа JSON учетной записи службы, либо укажите файл ключа JSON учетной записи службы при создании клиента диспетчера секретов SecretManagerServiceClient(). Просмотрите options.keyFilename в github.com/googleapis/nodejs -secret-manager / blob / master / src / v1 /   -  person John Hanley    schedule 18.05.2020
comment
@sethvargo Я работаю локально. Подключаюсь к firebase через cli.   -  person mpc75    schedule 18.05.2020
comment
@JohnHanley, спасибо за совет. Я подключил keyFileName в качестве опции, как вы предложили, но теперь я получаю сообщение об ошибке details: "Permission 'secretmanager.versions.access' denied for resource..., которое я проверил, и строка, которую я передал, соответствует точному имени секрета (в моем коде выше это CLIENT_ID.   -  person mpc75    schedule 18.05.2020
comment
У учетной записи службы нет разрешения на доступ к секрету.   -  person John Hanley    schedule 18.05.2020
comment
@JohnHanley ах, извините за наивный вопрос и спасибо за терпеливый ответ :) Я включил его правильно, и теперь все работает, спасибо, рад принять ваш ответ, если вы хотите его опубликовать! Последний вопрос немного выходит за рамки, но теперь я опасаюсь, что конфиденциальное содержимое json-ключевого файла служебной учетной записи находится в моем локальном коде, существует ли отраслевой стандарт о том, как справиться с этим, кроме gitignoring?   -  person mpc75    schedule 18.05.2020
comment
Вы установили Cloud SDK или выполнили локальные инструкции по настройке на странице: cloud.google.com/secret-manager/docs/reference/   -  person sethvargo    schedule 18.05.2020
comment
Вы не должны загружать учетные данные учетной записи службы локально. Вместо этого загрузите SDK и запустите gcloud auth application-default login.   -  person sethvargo    schedule 18.05.2020
comment
@ mpc75 Где вы будете размещать этот код? Вы не должны хранить файл учетной записи службы где-либо рядом с исходным кодом. После развертывания в облаке используйте учетную запись службы по умолчанию для службы, чтобы предоставить учетные данные.   -  person John Hanley    schedule 18.05.2020
comment
@sethvargo и @JohnHanley благодарит вас за то, что вы придерживаетесь этого, я чувствую, что забиваю голову и, возможно, использую неправильное решение. Я использую функции Firebase для развертывания кода и решил, что лучше централизовать свои секреты в диспетчере секретов, чем firebase functions:config:set; однако, учитывая мою неопытность за пределами области Firebase, возможно, для меня разумнее просто придерживаться firebase functions:config:set.   -  person mpc75    schedule 18.05.2020