Как установить «Access-Control-Allow-Credentials» в хостинге Firebase - PullRequest
0 голосов
/ 29 октября 2018

Я настроил приложение Node Express в Firebase Functions и приложение React в Firebase Hosting (аналогично шаблону , который я создал, за исключением того, что я настроил сеансовые куки в Express и Я использую Passport JS).

My firebase.json содержит следующее:

{
  "hosting": {
    "public": "build",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "/api/**",
        "function": "app"
      }
    ]
  }
}

Если я сделаю запрос прямой выборки из приложения React в API, используя полный абсолютный URL-адрес API, все будет работать просто так:

try {
    const url = 'https://us-central1-[my-app-name]-app.cloudfunctions.net/app/api/v1.0/auth/status';
    const response = await fetch(url, 
      {
        method: 'GET',
        credentials: 'include',
        headers: {
          'Content-Type': 'application/json',
        },
      }
    );
    json = await response.json();
    console.log(json); // {"isAuthenticated":true}
  } catch (error) {
    throw error;
  }

API проверяет существование пользователя в сеансе и соответственно возвращает ответ.

Однако, если я попытаюсь получить доступ к API через прокси-сервер перезаписи, который я настроил в файле firebase.json, используя только относительный URL /api/v1.0/auth/status, я все равно получу ответ (который подтверждает, что Firebase прокси-сервер соответствующим образом запрашивает) , но флаг isAuthenticated имеет значение false, а не true.

Я предположил, что это потому, что в прокси-запросе отсутствует мой ценный заголовок withCredentials, поэтому я установил это и в файле firebase.json:

{
  "hosting": {
    "public": "build",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "/api/**",
        "function": "app"
      }
    ],
    "headers": [
      {
        "source": "/api/**",
        "headers": [
          {
            "key": "Access-Control-Allow-Credentials",
            "value": "true"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ]
      }
    ]
  }
}

Однако, похоже, это не имеет никакого эффекта. Я что-то упускаю?

Редактировать: При ближайшем рассмотрении я полагаю, что это потому, что заголовок cookie не передается в приложение функций, когда Firebase проксирует запрос (заголовки «учетные данные» не требуются, поскольку они не пересекаются -оригинал), поэтому я считаю, что должен быть какой-то способ сказать Firebase включить куки в запрос на перезапись / прокси?

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете включить этот код в вашу экспресс-конфигурацию. Это решило бы проблему с сердечником

// allow-cors
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    next();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...