Google Cloud Storage возвращает неверную личность - PullRequest
1 голос
/ 09 января 2020

На моей локальной машине я работал над двумя разными проектами с разными учетными записями и т. Д. c, ни один из этих проектов не связан, поэтому.

Давайте представим, что два проекта имеют следующие электронные письма :

first-project@gmail.com second-project@gmail.com

Для второго проекта (second-project@gmail.com) я создал API, используя nodejs, где у меня есть конечная точка для загрузки файлов, поэтому я пытаюсь загрузить файл в корзину с помощью почтальона, конфигурация на моей конечной точке nodejs имеет идентификатор проекта учетной записи second-project@gmail.com, а также имя корзины, существующее в second-project@gmail.com, вот код моего файла загрузки:

const GCStorage = require('@google-cloud/storage');
const Multer = require('multer');

const CLOUD_BUCKET = 'mybucketname';

const storage = new GCStorage.Storage({
  projectId: '1234657890'
});
const bucket = storage.bucket(CLOUD_BUCKET);

// Returns the public, anonymously accessable URL to a given Cloud Storage
// object.
// The object's ACL has to be set to public read.
// [START public_url]
function getPublicUrl(filename) {
  return `https://storage.googleapis.com/${CLOUD_BUCKET}/${filename}`;
}
// [END public_url]

// Express middleware that will automatically pass uploads to Cloud Storage.
// req.file is processed and will have two new properties:
// * ``cloudStorageObject`` the object name in cloud storage.
// * ``cloudStoragePublicUrl`` the public url to the object.
// [START process]
function sendUploadToGCS(req, res, next) {
  if (!req.file) {
    return next();
  }

  const gcsname = Date.now() + req.file.originalname;
  const file = bucket.file(gcsname);

  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    },
    resumable: false
  });

  stream.on('error', err => {
    req.file.cloudStorageError = err;
    next(err);
  });

  stream.on('finish', () => {
    req.file.cloudStorageObject = gcsname;
    file.makePublic().then(() => {
      req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
      next();
    });
  });

  stream.end(req.file.buffer);
}
// [END process]

// Multer handles parsing multipart/form-data requests.
// This instance is configured to store images in memory.
// This makes it straightforward to upload to Cloud Storage.
// [START multer]
const multer = Multer({
  storage: Multer.MemoryStorage,
  limits: {
    fileSize: 5 * 1024 * 1024 // no larger than 5mb
  }
});
// [END multer]

module.exports = {
  getPublicUrl,
  sendUploadToGCS,
  multer
};

но я получаю следующую ошибку:

{
      domain: 'global',
      reason: 'forbidden',
      message: 'first-project@gmail.com does not have storage.objects.create access to mybucketname/1578598638283DeveloperInPixelsLogo1.png.'
    }

Как видите, сообщение содержит адрес электронной почты first-project@gmail.com Но это разные проекты и учетная запись, поэтому я могу ' Не понимаю, что здесь происходит, любая помощь, пожалуйста

1 Ответ

0 голосов
/ 09 января 2020

Создаемый объект storage - с использованием учетных данных приложения по умолчанию (АЦП) ; вероятно, он загружает учетные данные для учетной записи службы из вашего первого проекта.

Если вы хотите всегда использовать учетные данные для учетной записи службы второго проекта, вам следует либо убедиться, что ваша среда настроена правильно , либо используйте конструктор Storage , который позволяет передавать явные учетные данные , вместо того, чтобы пытаться загрузить их из источников по умолчанию.

...