Настрой страничный шлюз на прокси с nginx
К концу этого руководства шлюз будет работать перед сайтом за nginx: непропущенного посетителя отправляют на проверку, пройденная проверка ставит cookie, а поздние запросы проходят напрямую. Ты сначала понаблюдаешь за всем в режиме предпросмотра, так что ничего не блокируется, пока ты не подтвердишь подключение. Здесь используется nginx; рецепты Traefik, Caddy и Authelia следуют той же форме.
1. Включи режим предпросмотра
В панели открой команду и включи режим предпросмотра. Пока он включён, авторизатор шлюза записывает решения испытание против прямого пропуска на страницу статистики, но никогда не блокирует. Ты выключишь его в конце.
2. Включи шлюз на своём ключе сайта
Открой свой ключ сайта и перейди на страницу Шлюз на прокси. Включи Статус → Включено, затем задай:
- Тип испытания: Сыграть в игру (по умолчанию) или Подтвердить галочкой. Ключ сайта, который требует игру, всегда показывает игру, и страница об этом говорит. Выбор игры требует хотя бы одной установленной игры с переигрываемым артефактом.
- TTL пропуска: как долго одно решение пропускает посетителя (по умолчанию 30 минут). Короче значит больше перепроверок, но меньшее окно, если cookie украдут.
- Режим отказа: что делает твой прокси, когда не может достучаться до авторизатора Caputchin. Fail-closed блокирует (безопаснее для портала входа); fail-open пропускает запросы (избегает простоя на публичном сайте).
Оставь Язык и Тему на следовать за посетителем: тогда проверка говорит на языке посетителя, следует его светлому или тёмному предпочтению и автоматически несёт бренд этого ключа сайта. В разделе Дополнительно можно переименовать cookie шлюза, перенести путь callback и ограничить шлюз конкретными путями; это прохождение использует значения по умолчанию. Смотри Настрой испытание под себя.
Страница также показывает готовый к копированию сниппет 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_intercept_errors on;
error_page 500 502 503 504 = @cpt_unreachable;
# ...proxy_pass to your app...
}
location = /_cpt_authz {
internal;
auth_request off;
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
proxy_connect_timeout 2s;
proxy_read_timeout 2s;
}
location @cpt_challenge {
return 302 https://verify.caputchin.com/v1/gate/challenge?site=YOUR_SITE_KEY&return=$scheme://$host$request_uri;
}
# This is your fail mode. `return 403` blocks when Caputchin is unreachable
# (fail closed); `return 204` lets the request through (fail open).
location @cpt_unreachable {
return 403;
}Авторизатор отвечает только 204 или 401, так что всё остальное, включая таймаут, значит, что Caputchin недостижим и решает твой режим отказа. Скопируй сниппет из панели, и он уже совпадает с выбранным тобой режимом отказа.
Закрой входные пути (HTML портала и POST входа). Не закрывай подзапрос авторизатора, health-check, или callback ниже.
5. Добавь callback, который ставит cookie
Страница проверки завершается автоотправкой маленького POST на /__cpt/callback на твоём источнике (или на тот путь callback, который ты задал), с cpt_gate (пропуском) и to (куда отправить посетителя) в теле. Поле называется cpt_gate, даже если ты переименовал cookie. Крошечный обработчик ставит 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. Запусти в бой
Когда числа выглядят правильно, выключи режим предпросмотра. Шлюз теперь принуждает: непропущенных посетителей отправляют к игре, решившие посетители гуляют, пока их пропуск не истечёт.
Куда дальше
- Рецепты обратного прокси: Traefik, Caddy, и полное прохождение Authelia.
- Статистика страничного шлюза на прокси: что значит каждое число, когда ты в бою.
- Обзор: концепция и то, чего шлюз намеренно не делает.