Я думаю, начну с удаления нашего текущего Droplet и настройки его заново, так как этот Docker был настроен несколько лет назад. Я отпишусь, когда сделаю это и протестирую.
Звучит как хороший план. Для большинства сообществ мы рекомендуем оставаться на ветке по умолчанию tests-passed, так как она предоставляет новейшие функции и исправления ошибок Discourse. С момента последнего стабильного релиза в аутентификации произошло множество изменений, поэтому вы можете обнаружить, что некоторые вещи начнут работать сами по себе.
@david, сегодня я потратил время, чтобы ещё раз попробовать. Сейчас я использую чистую установку Discourse (последняя версия на стабильной ветке passed, как вы и советовали).
Я настроил OAuth2 с помощью плагина, как и раньше, со следующими настройками:
oauth2 client id: MY-CLIENT-ID
oauth2 client secret: MY-CLIENT-SECRET
oauth2 authorize url: https://MY-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token
Если я использую URL, сформированный вручную, получаю следующее (это новое):
Время ожидания авторизации истекло, или вы переключили браузер. Пожалуйста, попробуйте снова.
И обычную ошибку в логах:
(oauth2_basic) Сбой аутентификации! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | Обнаружен CSRF
С другой стороны, если я использую кнопку OAuth2 в окне входа в Discourse, получаю:
Ой
Программное обеспечение, управляющее этим форумом обсуждений, столкнулось с непредвиденной проблемой. Приносим извинения за неудобства.
Подробная информация об ошибке была записана в логи, и было автоматически сгенерировано уведомление. Мы разберёмся в этом.
Я также получаю следующие ошибки в логах /logs:
ArgumentError (Invalid URI: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'
и
Failed to handle exception in exception app middleware : Invalid URI:
@david Я попробовал ваше предыдущее предложение относительно установки oauth2_user_json_url и отключения oauth2_fetch_user_details, но после этого получил множество (новых) ошибок:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ОШИБКА: значение null в столбце “provider_uid” нарушает ограничение not-null
ДЕТАЛИ: Невалидная строка содержит (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’
Не удалось обработать исключение в промежуточном ПО приложения исключений: PG::NotNullViolation: ОШИБКА: значение null в столбце “provider_uid” нарушает ограничение not-null
ДЕТАЛИ: Невалидная строка содержит (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
И, конечно же, обычное сообщение:
(oauth2_basic) Ошибка аутентификации! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF обнаружен
Однако я заметил в последнем сообщении (CSRF обнаружен), что во вкладке env указано:
hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca
Нормально ли, что hostname не совпадает с именем HTTP_HOST? Может ли это быть причиной ошибки CSRF?
Привет, Денис,
Что-нибудь получилось?
У меня та же ошибка:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
Как ты это исправил?
Спасибо,
Бим
Денис и я выяснили, что NeonCRM не совсем следует спецификации OAuth2: они отправляют user_id внутри переменной access_token, и её нельзя использовать как реальный токен доступа.
Поэтому вам нужно отключить oauth2_fetch_user_details и установить oauth2_callback_user_id_path в token (не access_token, так как библиотека oauth2 для Ruby переименовывает её для внутреннего использования).
При этом всё должно работать, но нет возможности получить email или имя пользователя.
Привет, Денис,
Я использую Mattermost, поэтому всё работает немного иначе. Однако твоя информация заставила меня внимательнее изучить настройки, и теперь у меня всё работает. Спасибо!!
Вот мои настройки для Mattermost как провайдера OAuth2 для Discourse:
Настройки в текстовом виде для поисковых систем:
oauth2 client id: <client id из настройки провайдера OAuth2 в Mattermost>
oauth2 client secret: <client secret из настройки провайдера OAuth2 в Mattermost>
oauth2 authorize url:https://chat.animalrebellion.org/oauth/authorize
oauth2 token url:https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: CHECKED
oauth2 user json url:https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: CHECKED
На стороне Mattermost URL обратного вызова установлен как:
https://base.animalrebellion.org/auth/oauth2_basic/callback
Хотелось бы ещё узнать, как объединить first_name и last_name в поле “json name path” как full_name, но можно обойтись использованием свойства “username” или “first_name”.
Надеюсь, это поможет.
С уважением,
Beam
Ссылки на ресурсы:
Ссылка на плагин: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Ссылка на инструкцию по установке плагина в Discourse: Install plugins on a self-hosted site
Рады, что у вас получилось, @Beam!
