Ошибка аутентификации Google

Здравствуйте,

Я новичок в Discourse. Недавно создал форум и сейчас переезжаю на новый домен вместе с сайтом.

Старый домен форума: https://forum.skymail.app (не активен, перенаправляет на новый сайт)

Новый домен: https://forum.sugarmail.app (работает)

У меня возникли проблемы с авторизацией через Google. У меня есть проект в Google Cloud, и после перехода на новый домен я также изменил URL перенаправления в разделе Client ID. Сейчас он установлен как:

https://forum.sugarmail.app/auth/google_oauth2/callback

Теперь о проблеме. При попытке «войти через Google» в Discourse появляется следующая ошибка:

https://forum.sugarmail.app/auth/failure?message=csrf_detected Авторизация истекла по времени, или вы сменили браузер. Пожалуйста, попробуйте снова.

Когда форум находился на старом домене forum.skymail.app, авторизация через Google работала без проблем.

После смены домена я выполнил команду ./launcher rebuild app, обязательно обновив домен в файле app.yaml в переменной DISCOURSE_HOSTNAME (на самом деле форум вообще не загружался, пока я этого не сделал).

Пожалуйста, дайте какие-либо советы.

Обычно при запуске процесса входа в систему в вашем браузере устанавливается cookie _forum_session. Однако на вашем сайте этого, похоже, не происходит.

Есть ли у вас какие-либо плагины или прокси, которые могут мешать работе cookie на вашем сайте?

Спасибо за ответ.

Плагины — нет, я их не использую. Единственное, что я сделал после установки, — это включил аутентификацию через Google (client ID и secret) и активировал опцию «всегда использовать HTTPS».

Прокси — я использую nginx в качестве обратного прокси (он также обслуживает основной сайт приложения).

    # discourse
    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass_request_headers on;
            proxy_pass http://localhost:10080;
    }

а в containers/app.yaml:

expose:
  - "10080:80"   # http
  - "10443:443" # https

Let’s Encrypt в настройках Discourse не включён. Таким образом, nginx внутри контейнера обслуживает обычный HTTP, а внешний nginx выполняет завершение SSL.

Это практически такая же конфигурация, как и на старом домене; единственное отличие — «принудительный HTTPS».

Я использую версию 2.6.0.beta3.

Ох, черт, это “принудительный https”, который я ранее отключил.

Я недавно включил его, чтобы избежать предупреждения в Chrome о “небезопасном содержимом страницы”, которое возникало из-за ссылок на изображения через обычный http.

Чтобы повторить: я выполняю SSL-терминацию во внешнем nginx, и насколько я знаю, в самом Discourse SSL не используется.

Отключение “принудительного https” снова делает аутентификацию Google рабочей (мне пришлось добавить URL перенаправления через обычный http в проекте Google Cloud).

Но это не хорошо, потому что как только появятся изображения, появятся предупреждения о “небезопасном сайте” / смешанном содержимом.

Есть ли способ сохранить работу аутентификации Google с включенным “принудительным https” и SSL-терминацией вне Discourse?

(Я бы использовал собственную поддержку SSL в Discourse, но она предполагает, что он “владеет” доменом, поэтому мне пришлось бы настроить дополнительный IP-адрес для этого VPS и разделить основной сайт и форум… что немного утомительно… )

Убедитесь, что вы передаете заголовок X-Forwarded-Proto: https.

Спасибо, @riking! Я скопировал блок nginx из вашей ссылки дословно, а затем включил «принудительный HTTPS», как рекомендовано в консоли администратора Discourse.

Мой форум снова работает, и авторизация через Google функционирует.

Однако одна проблема всё ещё сохраняется:

И Chrome, и Firefox выдают предупреждения о небезопасном содержимом страницы.

При просмотре сетевого трафика в инструментах разработчика Chrome обнаруживается эта ссылка (обычный HTTP, а не HTTPS):

http://forum.sugarmail.app/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_512x512.png

А, ладно. Я просто установил новую пользовательскую иконку сайта, и теперь она загружается через https. Больше нет предупреждений о «смешанном содержимом».

Прекрасно, спасибо за помощь!