У меня есть функция Google Cloud. Я создал учетные данные для своего проекта и авторизовал http://localhost & http://localhost: 3000 в качестве источника. У меня также есть учетная запись пользователя Google, которой я назначил роль cloudfunctions.functions.invoke. Я подтверждаю это, перейдя в облачную функцию в консоли и развернув пункт «Cloud Functions Invoker» и увидев там свою учетную запись.
Я могу успешно получить доступ к функции с помощью curl.
curl https: // [google-cloud-server] / test5 -H "Авторизация: токен my-identity-bearer"
Однако, если я пытаюсь вызвать функция из моего приложения React (я пробовал и топор ios и выборку), я получаю следующую ошибку ....
Доступ к XMLHttpRequest по адресу https: // [google -cloud-server] / test5? a = b 'from origin' http://localhost: 3000 'заблокирован политикой CORS: Ответ на запрос перед полетом не проходит проверку контроля доступа: Нет Заголовок «Access-Control-Allow-Origin» присутствует в запрашиваемом ресурсе.
Несколько замечаний ...
- Если я не возникну проблем с CORS сделать функцию доступной для всех пользователей
- Посредством регистрации я подтвердил, что, будучи защищенным, запрос никогда не делает это функция, где у меня есть код CORS для проверки перед полетом. Это имеет смысл, так как он должен быть защищен Google. Но вся документация, которую я нахожу в функциях Google Cloud, рассказывает о работе с CORS-компонентами внутри функции. Что-то отвечает на запрос моего приложения React до того, как он достигнет моей функции. Я понятия не имею, что / где.
Я добавил так много тегов к этому сообщению, потому что я действительно не знаю, какой слой вызывает проблему. Я, вероятно, делаю что-то действительно очевидное / глупое, но у меня нет идей!
Облачная функция ....
exports.test5 = (req, res) => {
console.log('function invoked');
// Set CORS headers for preflight requests
// Allows GETs from any origin with the Content-Type header
// and caches preflight response for 3600s
res.set('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS') {
console.log('Determined it is OPTIONS request');
// Send response to OPTIONS requests
res.set('Access-Control-Allow-Methods', 'GET');
res.set('Access-Control-Allow-Headers', 'Authorization');
res.set('Access-Control-Max-Age', '3600');
res.status(204).send('');
} else {
console.log('Main function body');
res.send('Hello World!');
}
};
Вызов из клиента React ...
const config =
{
params: payload,
headers:
{
Authorization: `bearer ${window.IDENTITY_TOKEN}`
}
};
axios.get(url, config)
.then((res) => {
...
})
.catch((err) => {
handleError(err);
});
Есть идеи? Спасибо