Discourse OAuth2 Basic

Я нашел проблему: заголовок не был установлен как “Content-Type: application/json”. И я вижу, что у @qlands выше была та же самая ситуация.

Единственная оставшаяся для меня проблема такая же, как у @nodomain: аккаунт создаётся успешно, но аватар не добавляется. Пример ответа:

Body: {
  "access_token":"...",
  "token_type":"bearer",
  "expires_in":"3600",
  "scope":"profile",
  "profile" : {
    "id":1234,
    "email": "...",
    "name": "...",
    "picture": "https://somedomain.com/somevalidpicture.jpg"
  }
} 

И он корректно разбирается, так как появляется в следующем логе:

Отладка OAuth2: ответ after_authenticate: 

creds: {"token"=>"...", "expires_at"=>1702053692, "expires"=>true}
uid: 1234
info: {"email"=>"...", "name"=>"...", "avatar"=>"https://somedomain.com/somevalidpicture.jpg"}
extra: {}

Я проверил, что адрес картинки верный, а её размер составляет 300x300.

Есть ли какие-то идеи по этому поводу?

Редактирование: кто-то только что создал аккаунт, и он подтянул картинку из Gravatar. Возможно, валидная картинка из JSON перезаписывается пустым результатом от Gravatar?

Authentik как провайдер OAuth

Сейчас я изучаю Authentik и хотел бы спросить, есть ли у кого-то опыт работы с ним и Discourse?

К сожалению, я не нашел официальной документации по интеграции с Discourse.

Там очень много настроек, в которых можно запутаться :smiley:

У Portainer реализация OAuth гораздо проще.

Portainer, просто для сравнения:

1 лайк

Как дела? Хочу реализовать SSO с Authentik для Discourse и Ghost, но мой проект пока на паузе.

Буду очень признателен за любые советы :slight_smile:

1 лайк

Сталкивался ли кто-нибудь с проблемой, когда SSO находится во внутренней сети, и когда Discourse пытается получить доступ к сайту SSO, используя внутренний IP-адрес, он становится недоступным?

tail -f production.log

(oauth2_basic) Обнаружена конечная точка настройки, запуск в процессе.
(oauth2_basic) Инициализирована фаза запроса.
Запущен POST "/presence/update" для 10.10.10.10 в 2024-06-15 18:19:44 +0000
Обработка PresenceController#update как */*
  Параметры: {"client_id"=>"xxx", "present_channels"=>["/chat-user/core/1"]}
Завершено 200 OK за 26 мс (Views: 0.2 мс | ActiveRecord: 0.0 мс | Allocations: 1895)
Запущен GET "/auth/oauth2_basic/callback?code=xxxx&state=xxxx" для 10.10.10.10 в 2024-06-15 18:19:49 +0000
(oauth2_basic) Обнаружена конечная точка настройки, запуск в процессе.
(oauth2_basic) Инициализирована фаза обратного вызова.
OAuth2::ConnectionError (FinalDestination: все разрешённые IP-адреса были запрещены)
lib/final_destination/ssrf_detector.rb:105:in `lookup_and_filter_ips'
lib/final_destination/http.rb:15:in `connect'
lib/middleware/omniauth_bypass_middleware.rb:43:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:391:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:289:in `call'

Ошибка веб-страницы

Упс
Программное обеспечение, управляющее этим форумом обсуждений, столкнулось с неожиданной проблемой. Приносим извинения за неудобства.

Подробная информация об ошибке была зафиксирована в логах, и сгенерировано автоматическое уведомление. Мы разберёмся в этом.

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

Я проверил логи файрвола, но не нашёл никаких записей о блокировке! Более того, и Discourse, и SSO находятся во внутренней сети, поэтому проблем с блокировкой файрволом или перехватом запросов быть не должно!

Но когда я указал IP-адрес сайта SSO как внешний публичный адрес, всё снова работает нормально!

Это баг в плагине или проблема с моей конфигурацией?

Вы можете добавить имя хоста вашего внутреннего сайта SSO в настройку сайта ‘allowed_internal_hosts’. После этого Discourse сможет подключиться к нему.

Как изменить client_id на appid в URL?
Мой сервер не поддерживает client_id в URL, только appid.
Мне нужно модифицировать плагин.
Пожалуйста, помогите.

Прошел год, и вы все еще помогаете с этим постом! Спасибо!! Authentik теперь работает у меня.

3 лайка

Здравствуйте, я использую OAuth2 с Zalo, но столкнулся с проблемой, показанной на прикрепленном изображении. Кто-нибудь знает причину?

Я настроил URL обратного вызова: https://sphere.daviteq.com/auth/basic_oauth2/callback

Может, кто-нибудь поделится конфигурацией authentik? Я почти уверен, что всё настроено правильно, но всё равно получаю ошибку: (oauth2_basic) Authentication failure! Timeout::Error: Faraday::TimeoutError, Timeout::Error

1 лайк

:partying_face: Этот плагин теперь включён в ядро Discourse в рамках Bundling more popular plugins with Discourse core. Если вы используете самохостинг и пользуетесь этим плагином, вам нужно удалить его из файла app.yml перед следующим обновлением.

x-ref

1 лайк