Настройка
У меня есть типичная настройка веб-приложения:
Я использую 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?