Caputchin
Прокси-барьер

Настрой прокси-барьер с nginx

Открыть как Markdown

К концу этого руководства барьер будет работать перед сайтом за nginx: непропущенного посетителя отправляют к игре, решённая игра ставит cookie, а поздние запросы проходят напрямую. Ты сначала понаблюдаешь за всем в режиме предпросмотра, так что ничего не блокируется, пока ты не подтвердишь подключение. Здесь используется nginx; рецепты Traefik, Caddy и Authelia следуют той же форме.

1. Включи режим предпросмотра

В панели открой команду и включи режим предпросмотра. Пока он включён, авторизатор барьера записывает решения испытание против прямого пропуска на страницу статистики, но никогда не блокирует. Ты выключишь его в конце.

2. Включи барьер на своём ключе сайта

Открой свой ключ сайта и перейди на страницу Прокси-барьер. Включи Статус → Включено, затем задай:

  • TTL пропуска: как долго одно решение пропускает посетителя (по умолчанию 30 минут). Короче значит больше перепроверок, но меньшее окно, если cookie украдут.
  • Режим отказа: что делает твой прокси, когда не может достучаться до авторизатора Caputchin. Fail-closed блокирует (безопаснее для портала входа); fail-open пропускает запросы (избегает простоя на публичном сайте).

Страница также показывает готовый к копированию сниппет nginx с уже вставленным ключом сайта.

3. Разреши источник, который ты закрываешь

Испытание перенаправляет назад только на разрешённый источник, тот же список разрешённых источников, что использует виджет. Убедись, что он включает источник, который ты закрываешь, например https://auth.example.com. Задай его в конфигурации Cap ключа сайта, если его там ещё нет.

4. Подключи авторизатор и редирект на испытание

Два блока location: внутренний подзапрос авторизатора и редирект испытания, к которому прокси прыгает при 401. Замени YOUR_SITE_KEY своим публичным ключом.

# 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;
}

Закрой входные пути (HTML портала и POST входа). Не закрывай подзапрос авторизатора, health-check, или callback ниже.

Страница испытания завершается автоотправкой маленького POST на /__cpt/callback на твоём источнике, с cpt_gate (пропуском) и to (куда отправить посетителя) в теле. Крошечный обработчик ставит cookie и перенаправляет. Полный контракт, включая почему важен каждый атрибут cookie, есть в рецептах обратного прокси. Минимум:

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. Понаблюдай за ним в предпросмотре

Загрузи закрытый URL. Поскольку предпросмотр включён, ты проходишь напрямую, но страница статистики записывает challenge_served (у тебя не было cookie) и, как только ты решишь и callback отработает, pass_issued. Перезагрузи, и ты должен увидеть, как passthrough растёт. Если испытания никогда не появляются, блок авторизатора не задевается; если callback отдаёт 400, проверь источник to.

7. Запусти в бой

Когда числа выглядят правильно, выключи режим предпросмотра. Барьер теперь принуждает: непропущенных посетителей отправляют к игре, решившие посетители гуляют, пока их пропуск не истечёт.

Куда дальше

На этой странице