Caputchin
Gerbang proxy

Siapkan gerbang proxy dengan nginx

Lihat sebagai Markdown

Di akhir tutorial ini gerbang akan berjalan di depan sebuah situs di balik nginx: pengunjung yang belum diloloskan dikirim ke sebuah game, game yang terpecahkan men-set cookie, dan permintaan berikutnya lewat langsung. Kamu akan mengamati keseluruhannya dulu dalam mode pratinjau, jadi tak ada yang diblokir sampai kamu memastikan penyambungan. Di sini dipakai nginx; resep Traefik, Caddy, dan Authelia mengikuti bentuk yang sama.

1. Nyalakan mode pratinjau

Di dasbor, buka tim dan nyalakan mode pratinjau. Selagi ia menyala, otorisator gerbang mencatat keputusan tantangan lawan lolos langsung ke halaman statistik tapi tak pernah memblokir. Kamu akan mematikannya di akhir.

2. Aktifkan gerbang pada kunci situsmu

Buka kunci situsmu dan pergi ke halaman Gerbang proxy. Nyalakan Status → Aktif, lalu atur:

  • TTL izin lewat: berapa lama satu penyelesaian meloloskan seorang pengunjung (default 30 menit). Lebih pendek berarti lebih banyak pemeriksaan ulang tapi jendela lebih kecil jika sebuah cookie dicuri.
  • Mode gagal: apa yang proxy-mu lakukan saat tak bisa menjangkau otorisator Caputchin. Fail-closed memblokir (lebih aman untuk portal login); fail-open meloloskan permintaan (menghindari waktu henti pada situs publik).

Halaman itu juga menampilkan cuplikan nginx siap-salin dengan kunci situsmu sudah terisi.

3. Izinkan origin yang kamu gerbangi

Tantangan hanya mengalihkan balik ke sebuah origin yang diizinkan, daftar origin yang diizinkan yang sama dengan yang widget pakai. Pastikan ia menyertakan origin yang kamu gerbangi, misalnya https://auth.example.com. Setel pada konfigurasi Cap kunci situs jika belum ada di sana.

4. Sambungkan otorisator dan pengalihan ke tantangan

Dua blok location: sebuah sub-permintaan otorisator internal, dan sebuah pengalihan tantangan yang proxy loncati saat 401. Ganti YOUR_SITE_KEY dengan kunci publikmu.

# Gate the protected paths.
location / {
  auth_request /_cpt_authz;             # 204 = allow, 401 = challenge
  error_page 401 = @cpt_challenge;
  # ...proxy_pass to your app...
}

location = /_cpt_authz {
  internal;
  proxy_pass https://verify.caputchin.com/v1/gate/authz?site=YOUR_SITE_KEY;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header Cookie $http_cookie;  # forward the cpt_gate cookie
}

location @cpt_challenge {
  return 302 https://verify.caputchin.com/v1/gate/challenge?site=YOUR_SITE_KEY&return=$scheme://$host$request_uri;
}

Gerbangi jalur masuk (HTML portal dan POST login). Jangan gerbangi sub-permintaan otorisator, health check, atau callback di bawah.

Halaman tantangan menyelesaikan dengan auto-mengirim sebuah POST kecil ke /__cpt/callback pada origin-mu, dengan cpt_gate (pass) dan to (ke mana mengirim pengunjung) di body. Sebuah handler mungil men-set cookie dan mengalihkan. Kontrak penuh, termasuk mengapa tiap atribut cookie penting, ada di resep reverse proxy. Minimalnya:

app.post("/__cpt/callback", express.urlencoded({ extended: false }), (req, res) => {
  const pass = String(req.body.cpt_gate || "");
  const to = String(req.body.to || "/");
  const target = new URL(to, `https://${req.headers.host}`);
  if (target.host !== req.headers.host) return res.status(400).end(); // same-origin only
  res.setHeader(
    "Set-Cookie",
    `cpt_gate=${pass}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=1800`
  );
  res.redirect(303, target.pathname + target.search);
});

6. Amati dalam pratinjau

Muat URL bergerbang. Karena pratinjau menyala, kamu lewat langsung, tapi halaman statistik mencatat sebuah challenge_served (kamu tak punya cookie) dan, begitu kamu menyelesaikan dan callback berjalan, sebuah pass_issued. Muat ulang dan kamu mestinya melihat passthrough menanjak. Jika tantangan tak pernah muncul, blok otorisator tak terkena; jika callback memberi 400, periksa origin to.

7. Terjunkan langsung

Saat angka-angka terlihat benar, matikan mode pratinjau. Gerbang kini menegakkan: pengunjung yang belum diloloskan dikirim ke game, pengunjung yang menyelesaikan menjelajah sampai pass mereka kedaluwarsa.

Ke mana selanjutnya

Di halaman ini