ОБНОВЛЕНИЕ: Решено!
Чтобы устранить проблему, я смог включить force_https, что полностью решило вопрос. Оказалось, что passkeys пытались маршрутизироваться через http://, но такой смешанный трафик не отслеживался браузером. Как выяснилось, Cloudflare вообще не был причиной проблемы. Надеюсь, это поможет кому-то ещё в будущем.
Оригинальный пост:
Проблема
Привет! Недавно я перенёс свой экземпляр Discourse за туннель Cloudflare, и, похоже, всё работает хорошо, за исключением passkeys. И существующая, и новая регистрация passkeys не удаются, но мне кажется, что логи не дают чёткого понимания, ПОЧЕМУ это происходит. Надеюсь, кто-то здесь сможет помочь мне найти остальную информацию для устранения неполадок, необходимую для решения этой проблемы:
Соответствующая информация
О моей конфигурации
- Использую Discourse Docker для развёртывания Discourse.
- Postgres и Redis развёрнуты внешним образом.
- Развёрнуто на Ubuntu на экземпляре AWS EC2.
- Как уже упоминалось, туннель Cloudflare обеспечивает TLS и выступает в роли прокси.
Что я пробовал
- Проверил свою конфигурацию, чтобы убедиться, что Discourse ожидает имя хоста моего форума (
forums.example.com). - Discourse настроен на порт 80 HTTP, так как Cloudflare обрабатывает TLS.
- Когда HTTP не сработал, я попытался принудительно заставить Discourse использовать только SSL, предоставив самоподписанный сертификат и перенаправив Cloudflare на Discourse через порт 443 с использованием протокола HTTPS.
- Убедился, что Cloudflare передаёт
forums.example.comна мой сайт. Я знаю это, так как любой другой заголовок хоста приводит к ошибке 404 в NGINX Discourse.
Соответствующие логи
- Этот момент немного сложен. Discourse не предоставляет ничего на стороне сервера (насколько я видел), и независимо от того, использую ли я Bitwarden, iCloud Keychain, Chrome или Firefox, результат одинаков.
- Логи самого passkeys практически отсутствуют.
- Наиболее полезная часть, которую я нашёл, была из консоли разработчика Firefox/Chrome при попытке создать новый passkey. Возвращается следующее:
{
"errors": [
"The origin of the authentication request does not match the server origin."
]
}
Это довольно явное указание на то, что что-то идёт не так между клиентом и Discourse (то есть прокси), но эти логи не указывают, какая информация передаётся туда и обратно для дальнейшего устранения неполадок.
Может ли кто-то помочь мне понять, какие ещё настройки или локи нужно проверить, или предложить другие рекомендации по устранению неполадок? Я считаю это маловероятным, но предположу, что ошибка в конфигурации Nginx также могла стать фактором. У меня фактически двойной прокси между клиентом и Discourse, где работают и CloudFlare, и Nginx. Стоит ли мне пересмотреть какую-либо часть этой конфигурации?
Что касается приоритета, то, конечно, было бы хорошо исправить это, но так как у меня всего около 8 пользователей из нескольких тысяч используют passkeys (при этом другие методы входа работают отлично), я не слишком сильно переживаю по этому поводу.