клиент узла облачного хранилища Google - учетные данные не работают должным образом - PullRequest
1 голос
/ 08 апреля 2020

Я работаю над проектом, в котором мне нужно получить доступ к некоторым объектам в корзине gcloud

Он отлично работает с переменной GOOGLE_APPLICATION_CREDENTIALS env, но не при попытке использовать keyfilename опция конструктора Storage. Вот минимальный пример, который показывает, что происходит:

const {Storage, File} = require('@google-cloud/storage');
const path = require("path");

// Fake bucket and file names
const bucketname = "my-bucket";
const filename = "test-file.txt";
// Points to a valid key file for a service account with read & write access to the bucket
const keyPath = path.resolve("./key.json");

const storage = new Storage({keyFile: keyPath}); // note that I'm providing a keyFile here
const bucket = storage.bucket(bucketname);
const file = new File(bucket, filename);

async function main() {
  console.log("try without GOOGLE_APPLICATION_CREDENTIALS");
  try {
    await file.download({ destination: "./test.txt" });
    console.log("ok");
    return;
  } catch (e) {
    console.log(e.message);
  }

  console.log("try with GOOGLE_APPLICATION_CREDENTIALS");
  try {
    process.env["GOOGLE_APPLICATION_CREDENTIALS"] = keyPath;
    await file.download({ destination: "./test.txt" });
    console.log("ok");
    return;
  } catch (e) {
    console.log("failed with GOOGLE_APPLICATION_CREDENTIALS");
    console.log(e.message);
  }
}
main();

Я ожидаю, что результат будет:

try without GOOGLE_APPLICATION_CREDENTIALS
ok

, но вместо этого я получу

try without GOOGLE_APPLICATION_CREDENTIALS
Anonymous caller does not have storage.objects.get access to my-bucket/test-file.txt.
try with GOOGLE_APPLICATION_CREDENTIALS
ok

Что здесь происходит?

1 Ответ

1 голос
/ 08 апреля 2020

Ну, это глупо, но это может кому-нибудь помочь:

Объект опций конструктора хранилища имеет опции KeyFile и keyFilename, с точно таким же описанием . (если быть точным, StorageOptions наследует их от GoogleAuthOptions)

Документация говорит только о опции keyFilename, но мой редактор также показывал мне KeyFile как параметр автозаполнения, и я использовал его, не слишком задумываясь об этом.

keyFilename - это тот, который вы хотите использовать, а не keyFile (для чего он нужен? Не знаю)

Короче говоря:

new Storage({keyFilename: "/path/to/key.json"}); // this works
new Storage({keyFile: "/path/to/key.json"}); // this doesn't
...