Можно ли использовать промежуточное программное обеспечение traefik forwardAuth для защиты страницы браузера (не api)?

Мне нужно защитить веб-страницу с помощью токена, хранящегося в параметре cookie или URL. Все примеры, которые я могу найти для использования forwardAuth промежуточного программного обеспечения, похоже, предназначены для защиты API, поскольку в запросе API легко предоставить заголовки. Отправка пользовательских заголовков не является вариантом с браузером, поэтому мне нужно использовать файлы cookie.

Я хотел бы, чтобы токен аутентификации передавался через строку запроса arg, например ?token=ABCDEFG, а затем сохранялся в файле cookie для будущих запросов. Вот как выглядит рабочий процесс:

схема рабочего процесса авторизации

Я пробовал поэкспериментировать с forwardAuth, чтобы увидеть, как я могу это сделать. Конечная точка аутентификации читает заголовок авторизации, но мне нужно что-то, что считывает файл cookie в запросе и преобразует его в заголовок авторизации.

Есть ли способ сделать это с помощью Traefik?


person Ben Davis    schedule 04.01.2021    source источник


Ответы (1)


Похоже, ответ - да. Первоначально я думал, что traefik не пересылает файлы cookie, но на самом деле похоже, что он пересылает файлы cookie.

В итоге я создал контейнер авторизации sidecar на том же хосте, что и traefik, чтобы запросы авторизации выполнялись быстрее.

Функция аутентификации выглядит так (узел / экспресс):

app.get('/auth', (req, res) => {
  logger.info('CHECKING AUTH');

  const url = new URL(`${req.headers['x-forwarded-proto']}://` +
                      `${req.headers['x-forwarded-host']}` +
                      `${req.headers['x-forwarded-uri']}`);

  const urlAuthToken = url.searchParams.get('token');

  if (urlAuthToken) {
    url.searchParams.delete('token');
    const domain = BASE_DOMAIN;
    const sameSite = false;
    const secure = url.protocol === 'https:';
    return res
        .cookie('auth-token', urlAuthToken, {domain, sameSite, secure})
        .redirect(url.toString());
  }

  // Simulate credentials check
  if (req.cookies['auth-token'] === 'my-little-secret') {
    return res.status(200).send();
  }

  return res.status(401).send('<h1>401: Unauthorized</h1>');
});
person Ben Davis    schedule 04.01.2021