# #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 слишком старый.