Как использовать новую сессию в Fetch API JavaScript?

Привет, ребята! У меня возникла проблема с аутентификацией в моем киоск-приложении. Мне нужно, чтобы два человека могли вставить свои смарт-карты и выполнить разные запросы.

Сейчас я использую fetch с credentials:include, и первый пользователь нормально аутентифицируется. Но потом оба запроса используют учетку первого юзера.

Как мне сделать так, чтобы для второго запроса использовалась другая сессия? Может, как-то очистить LTPA токен или создать новую сессию?

Наше приложение использует Set-Cookie и хранит токен в куки LTPA2 Token.

Буду благодарен за любые идеи!

Да, с этим можно помучаться. Я бы предложил использовать sessionStorage для хранения токенов каждого юзера. Перед запросом доставай нужный токен и добавляй в заголовки:

const token = sessionStorage.getItem('userToken');
fetch(url, {
  headers: { 'Authorization': `Bearer ${token}` }
})

Так сессии будут изолированы. Еще можно попробовать fetch с mode: 'no-cors' для второго запроса, чтобы точно не отправлялись куки. Главное не забыть почистить sessionStorage после использования.

Можно попробовать использовать fetch с опцией credentials: 'omit' для второго запроса. Это отключит отправку куков. Затем вручную добавь нужные заголовки авторизации для второго юзера. Типа так:

const response = await fetch(url, {
  credentials: 'omit',
  headers: {
    'Authorization': 'Bearer ' + secondUserToken
  }
});

Это должно помочь разделить сессии. Если не сработает, можно еще попробовать очистить куки между запросами.

Может, стоит попробовать использовать разные экземпляры AbortController для каждого запроса? Создаешь два контроллера, привязываешь их к разным fetch-запросам. Это должно изолировать сессии. А еще можно попробовать очищать кэш браузера между запросами - иногда помогает сбросить авторизацию. Главное не забыть потом восстановить нужные данные. Как думаешь, может сработать такой подход?

Попробуй для разных пользователей создать отдельные заголовки с куками. Например, создай два объекта Headers с разными значениями LTPA2Token и передавай их в fetch-запросы. Так сессии не будут пересекаться. Как думаешь, поможет ли это?

да, проблема с сессиями в таких случаях довольно частая. мой совет - попробуй использовать новый экземпляр fetch для каждого юзера. это можно сделать с помощью WindowOrWorkerGlobalScope.fetch(). создай два отдельных объекта с разными настройками для каждого пользователя:

const fetch1 = new WindowOrWorkerGlobalScope.fetch();
const fetch2 = new WindowOrWorkerGlobalScope.fetch();

и потом используй их для запросов. так ты сможешь изолировать сессии и куки для разных юзеров.

если не поможет, еще вариант - перед вторым запросом удалять куки LTPA2 Token через document.cookie. главное не забудь потом восстановить куки первого юзера, если нужно