Как включить учетные данные в fetch / preload с помощью Svelte / Sapper? - PullRequest
0 голосов
/ 27 марта 2020

Настройка

У меня есть типичная настройка веб-приложения:

  • Бэкэнд-служба, работающая на https://mybackendsvc.com
  • Пользователи аутентифицируются с mybackendsvc.com, и у меня есть сеанс повара ie.
  • Svelte / Sapper работает на https://myfrontend.com

Я использую Sapper preload для получения некоторых данных из https://mybackendsvc.com. Вот routes/mydata/[id].svelte:

<script context="module">
  export async function preload(page, session) {
    const res = await this.fetch(
      `https://mybackendsvc.com/api/public/${page.params.id}`,
      {
        credentials: 'include' // sends the session cookie to mybackendsvc.com
      }
    );
    if (res.status == 200) {
      let myData = await res.json();
      return { myData };
    } else if (res.status === 401) {
      this.error(401, "Unauthorized");
    } else {
      this.error(500, "Something went wrong");
    }
  }
</script>

<script>
  export let myData;
</script>

<div>
  {myData}
</div>

Обратите внимание на использование fetch с учетными данными:

{
  credentials: 'include'
}

Проблема: где выполняется «предварительная загрузка», имеет значение

Если пользователь переходит к mydata/[id] напрямую, preload запускается на сервере узла, Sapper не включает в себя сеанс повара пользователя ie (вероятно, потому что сервер узла не имеет к нему доступа), поэтому mybackendsvc.com отвечает с 401. Однако , если пользователь переходит на mydata/[id] по ссылке внутри моего приложения, preload запускается на стороне браузера, браузер включает в себя сеанс Cook ie, и вызов завершается успешно.

Как я могу сделать так, чтобы Sapper гарантировал, что fetch включает учетные данные в вызов API? Или вы не можете использовать preload для аутентифицированных вызовов API, только для публикуемых c вызовов API?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...