Bisakah middleware forwardAuth traefik digunakan untuk mengamankan halaman browser (bukan api)?

Saya perlu mengamankan halaman web dengan token yang disimpan dalam parameter cookie atau url. Semua contoh yang saya temukan untuk menggunakan forwardAuth middleware tampaknya untuk mengamankan API, karena mudah untuk menyediakan header dalam permintaan API. Mengirim tajuk khusus bukanlah suatu pilihan dengan browser, jadi saya perlu menggunakan cookie.

Saya ingin token autentikasi diteruskan melalui argumen string kueri, misalnya ?token=ABCDEFG, kemudian disimpan dalam cookie untuk permintaan di masa mendatang. Berikut alur kerjanya:

diagram alur kerja autentikasi

Saya sudah mencoba bereksperimen dengan forwardAuth untuk melihat bagaimana saya bisa melakukan ini. Titik akhir autentikasi membaca header Otorisasi, tetapi saya memerlukan sesuatu yang membaca cookie dalam permintaan dan mengubahnya menjadi header Otorisasi.

Apakah ada cara untuk melakukan ini dengan Traefik?


person Ben Davis    schedule 04.01.2021    source sumber


Jawaban (1)


Sepertinya jawabannya adalah ya. Awalnya saya mengira traefik tidak akan meneruskan cookie, namun ternyata ternyata meneruskan cookie.

Saya akhirnya membuat wadah autentikasi sespan di host yang sama dengan traefik sehingga permintaan autentikasi akan lebih cepat.

Fungsi auth terlihat seperti ini (node/ekspres):

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