Вызовите облачную службу запуска GCP из App Engine

# #google-app-engine #google-cloud-platform #google-cloud-run #google-iam

Вопрос:

Я понимаю, основываясь на этой документации, что вам необходимо назначить роль Вызывающего для вызывающей службы в вызываемой службе. У меня есть служба App Engine, которая пытается вызвать облачную службу запуска, для которой требуются запросы с проверкой подлинности.

Я следовал документации и назначил роль вызывателя облачного запуска учетной записи службы App Engine по умолчанию и использую перехватчик axios для прикрепления заголовка аутентификации к запросам, выполняемым из моей службы App Engine с помощью этого кода.

 const { GoogleAuth } = require("google-auth-library");

let client;
async function  getBearer(serviceBaseURL) {
// where serviceBaseURL is the URL of the service being called from this app engine service
    const auth = new GoogleAuth();
    try {
      if (!client)
        client = await auth.getIdTokenClient(serviceBaseURL);
      const clientHeaders = await client.getRequestHeaders();
      console.log(clientHeaders);
      // this logs `Bearer dy4UbC...`
      return clientHeaders["Authorization"];
    } catch (err) {
      console.error(err);
      throw Error("could not create an identity token: ", err);
    }
  }
 

Перехватчик axios написан так:

 authApiClient.interceptors.request.use(
  async (opts) => {
    const token = await getBearer(config.networking.auth_service_base);

    opts.headers['Authorization'] = token;
    return opts;
  },
  (err) => Promise.reject(err)
);
 

По какой-то причине я все еще получаю несанкционированную ошибку 401 при попытке вызвать мою службу.

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

Комментарии:

1. Что делает этот журнал console.log(Заголовки клиентов[«Авторизация»];); Не показывайте весь токен только первые несколько символов. Функция должна возвращать «Носитель <ID_TOKEN>». Убедитесь, что вы правильно создаете заголовок авторизации HTTP с этим значением, если вы не используете клиент позже в своем коде. Отредактируйте свой вопрос и покажите, как вы используете заголовок авторизации HTTP и делаете запрос.

2. Какой базовый URL вы используете? Можете ли вы поделиться шаблоном этого URL-адреса?

3. @JohnHanley Я отредактировал вопрос, чтобы показать, что я использую перехватчик

4. @guillaumeblaquiere URL-адрес-это URL-адрес службы, которую я хочу получить с помощью структуры : имя службы-dsfg6sd84-ue.a.run.app

5. 1. Какой учетной записью вы пользуетесь? Пожалуйста, подтвердите это с помощью команды gcloud auth list. Учетная запись со звездочкой должна быть авторизована в Cloud Run. Вы также можете запустить gcloud config config-помощник и дважды проверить свойство core/account. 2. Также можете ли вы запустить его с помощью curl-v, чтобы увидеть заголовки? 3. Как вы добавили роль cloud run invoker в учетную запись службы по умолчанию, используя gcloud/графический интерфейс? Если это сделано через gcloud, пожалуйста, убедитесь, что версия gcloud составляет не менее 243.0.0 с помощью «gcloud —версия» и «обновление компонентов gcloud», чтобы обновить, если gcloud слишком старый.