Избегайте предварительной проверки CORS для вызываемой функции Firebase - PullRequest
0 голосов
/ 26 марта 2019

У меня есть функция вызываемого облака Firebase , которую я вызываю в своем приложении javascript в браузере.

Поскольку хост запроса ... cloudfunctions.net, а не мой домен приложения, это приводит к предварительному запросу CORS перед опциями POST.

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

Есть ли способ избежать этого предполёта с помощью функций Firebase Callable Cloud? Возможно, есть способ прокси-запроса через Firebase Hosting, например , который вы можете использовать с http Cloud Functions

Ответы [ 2 ]

1 голос
/ 27 марта 2019

После просмотра документов Firebase и JS SDK я решил, что это невозможно без использования / переопределения частных API.

Решением, которое я использовал, является репликация кода JS SDK , но с указанием URL-адреса, который идет через хостинг Firebase , поэтому он находится в том же домене, что и мое приложение.

Та же функция облака, тот же код приложения, без предварительной проверки CORS ??


  1. Создание нормальной функции вызываемого облака в Firebase
  2. Добавить переписать к firebase.json
{
 ...
 "hosting": {
   ...
   "rewrites": [
      {
        "source": "myFunction",
        "function": "myFunction"
      }
   ]
 }
}
  1. Вместо того, чтобы звонить по номеру firebase.functions().httpsCallable('myFunction'), отправьте POST-запрос на ваш новый URL-адрес
const token = await firebase.auth().currentUser.getIdToken()
const response = await fetch(
  'https://myapp.web.app/myFunction',
  {
    headers: {
      'Content-Type': 'application/json',
      Authorization: 'Bearer ' + token
    },
    method: 'post',
    body: JSON.stringify({ data })
  }
)

Теперь URL-адрес находится в вашем домене, так что никаких проблем с CORS

0 голосов
/ 26 марта 2019

Из-за безопасности невозможно перейти к предварительно выданному запросу

Ссылка: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests

Предварительно просвечиваемый запрос будет пропущен при выполнении всех следующих условий:

  • Допустимы только следующие методы:
    • GET
    • ГОЛОВА
    • POST
  • Помимо заголовков, автоматически устанавливаемых пользовательским агентом (например, Connection, User-Agent или любым другим заголовком с именами, определенными в спецификации Fetch как «имя запрещенного заголовка»), единственными заголовками, которые являются разрешено устанавливать вручную те, которые спецификация Fetch определяет как «заголовок запроса CORS-safelisted», а именно:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type (но обратите внимание на дополнительные требования ниже)
    • DPR
    • Downlink
    • Сохранение-данных
    • Viewport-ширина
    • Ширина
  • Единственные допустимые значения для заголовка Content-Type:
  • текст / обычный
Нет прослушивателей событий, зарегистрированных в любом объекте XMLHttpRequestUpload, используемом в запросе; доступ к ним осуществляется с помощью свойства XMLHttpRequest.upload. В запросе не используется объект ReadableStream.
...