Не удается экспортировать модель tflite с помощью метода POST axios, ошибка: сбой запроса с кодом состояния 401

Моя цель - использовать облачную функцию Firebase для экспорта tflite-модели, обученной из Google Cloud Automl.

Я следил за документом из https://cloud.google.com/vision/automl/object-detection/docs/export-edge и плавно экспортировать модель с помощью скручивания на терминале, но не с помощью функции axios в облаке. С помощью следующего кода я получил 401 несанкционированную ошибку, даже если я установил GOOGLE_APPLICATION_CREDENTIALS в .env и запросил пакетом dotenv.

Мой вопрос: можно ли экспортировать модель с запросом axios POST? Если тогда что я сделал не так?

//index.js
require("dotenv").config();

//.env
GOOGLE_APPLICATION_CREDENTIALS="./config.json"
async function exportModel() {
  const header = {
    "Content-Type": "application/json;charset=utf-8",
    Authorization:
      "Bearer $(gcloud auth application-default print-access-token)",
  };

  // Construct request
  const request = {
    outputConfig: {
      modelFormat: "tflite",
      gcsDestination: {
        outputUriPrefix: `gs://${output-storage-bucket}/`,
      },
    },
  };

  axios
    .post(
      `https://automl.googleapis.com/v1/projects/${projectId}/locations/us-central1/models/${model_id}:export`,
      request,
      {
        headers: header,
      }
    )
    .then((response) => {
      console.log(response);
      return response;
    })
    .catch((error) => {
      console.log(error);
      return error;
    });
}

Ошибка

Error: Request failed with status code 401
    at createError (/srv/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/srv/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/srv/node_modules/axios/lib/adapters/http.js:236:11)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)

person SanyapongY    schedule 16.04.2020    source источник


Ответы (1)


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

 Authorization:
      "Bearer $(gcloud auth application-default print-access-token)" 

Вы пытаетесь запускать команды gcloud внутри облачной функции Firebase?

Здесь вы можете найти информацию о том, как аутентифицировать ваш запрос с помощью токенов доступа OAuth2.

Узлы библиотеки аутентификации Google

person marian.vladoi    schedule 16.04.2020
comment
Я имею в виду gcloud auth application-default print-access-token на терминале, затем захватите результат на терминале и замените этот код. О, ты имеешь в виду, что мне нужен новый токен аутентификации, потому что я нахожусь на env node.js, верно ?. - person SanyapongY; 16.04.2020
comment
Если вы используете ярлык и просто скопируете и вставите токен доступа, он должен работать. Но я до сих пор не понимаю, зачем вы устанавливаете GOOGLE_APPLICATION_CREDENTIALS, если вы просто берете токен с консоли. Запустите команду, используя gcloud, проверьте, работает ли она, а затем возьмите токен и используйте его в своем коде. Это не самый подходящий способ сделать это. - person marian.vladoi; 16.04.2020