| Краткое содержание | Discourse OpenID Connect позволяет использовать провайдера OpenID Connect в качестве провайдера аутентификации для Discourse. | |
| Руководство по установке | Этот плагин включен в ядро Discourse. Отдельная установка плагина не требуется. |
Возможности
Плагин стремится обеспечить минимальную реализацию спецификации. В частности, он поддерживает «поток авторизационного кода» (Authorization Code Flow). Для начала работы следуйте инструкциям по установке плагина или обратитесь к вашему хостинг-провайдеру.
Наш плагин oauth2-basic можно использовать для подключения к некоторым провайдерам OpenID Connect (OpenID Connect основан на OAuth2). Однако этот плагин требует значительно меньше ручной настройки и может использовать JWT «ID Token», если JSON API недоступен.
Настройка автоматически выполняется с использованием документа обнаружения OpenID Connect. Согласно спецификации, он должен находиться по адресу <domain_издателя>/.well-known/openid-configuration, но Discourse поддерживает любой путь для совместимости с не соответствующими спецификации реализациями (например, Azure B2C). Документ обнаружения кэшируется на 10 минут для повышения производительности на сайтах с высоким трафиком.
Если документ обнаружения включает параметр userinfo_endpoint, плагин использует его для сбора метаданных пользователя. В противном случае плагин извлекает метаданные из id_token (JWT), предоставленного конечной точкой токена. Плагин НЕ проверяет подлинность подписи JWT, так как это значительно усложнило бы систему. Это решение поддерживается спецификацией:
Если ID Token получен через прямую коммуникацию между клиентом и конечной точкой токена (что имеет место в данном потоке), для проверки издателя может использоваться валидация TLS-сервера вместо проверки подписи токена.
Для провайдеров идентификации, поддерживающих авторизацию без секрета с использованием «Потока авторизационного кода с доказательством ключа для обмена кодом» (PKCE), следует включить PKCE, а параметр конфигурации client_secret можно опустить.
Конфигурация
Базовые параметры конфигурации
-
openid_connect_enabled:Включить аутентификацию OpenID Connect -
openid_connect_discovery_document: URL документа обнаружения OpenID Connect. Обычно находится по адресуhttps://your.domain/.well-known/openid-configuration -
openid_connect_client_id: ID клиента OpenID Connect -
openid_connect_client_secret: Секрет клиента OpenID Connect -
openid connect rp initiated logout: Перенаправлять пользователя наend_session_endpointпосле выхода. Должно поддерживаться вашим провайдером идентификации и быть указано в документе обнаружения. -
openid connect rp initiated logout redirect: (опционально)post_logout_redirect_uri, который будет передан конечной точке выхода. Если указан, он должен быть зарегистрирован у провайдера идентификации. -
openid_connect_authorize_scope: Сферы доступа (scopes), отправляемые на конечную точку авторизации. Должна включать ‘openid’ -
openid_connect_use_pkce: Включить Proof Key for Code Exchange (PKCE) для аутентификации OpenID Connect. -
openid_connect_verbose_logging: Вести подробное логирование информации об аутентификации openid-connect в/logs. Оставьте это отключенным при обычном использовании.
Расширенные параметры конфигурации
-
openid_connect_token_scope: Сферы доступа (scopes), отправляемые при запросе к конечной точке токена. Официальная спецификация не требует этого. -
openid_connect_error_redirects: Еслиerror_reasonобратного вызова содержит первый параметр, пользователь будет перенаправлен на URL во втором параметре. Используется для необычных реализаций, отправляющих ошибки в ответ на действия пользователя (например, Azure B2C). -
openid_connect_allow_association_change: Разрешить пользователям отключать и повторно подключать свои учетные записи Discourse от провайдера OpenID Connect.
-
openid_connect_groups_claim: Имя утверждения (claim) в ответе OIDC[1], содержащего группы пользователя в виде массива строк. Оставьте пустым, чтобы отключить синхронизацию групп. См. раздел Синхронизация групп ниже. -
openid_connect_user_field_mappings: Отображение утверждений OIDC[2], которые будут сохранены в пользовательских полях Discourse. Пользовательские поля идентифицируются их числовым ID, который можно найти в URL при их редактировании через панель администратора.
Синхронизация групп
Плагин может автоматически синхронизировать членство в группах от вашего провайдера OpenID Connect с группами Discourse. При каждом входе плагин считывает настроенное утверждение из токена OIDC и обновляет членство пользователя в группах соответствующим образом. Чтобы включить синхронизацию групп:
-
Настройте вашего провайдера идентификации на возвращение массива групп в одном из утверждений. Это должен быть массив строк.
-
Установите
openid_connect_groups_claimв имя утверждения в токене OIDC, содержащего группы пользователя (например,cognito:groups). После установки информация начнет синхронизироваться с системой «Связанные группы» (Associated Groups) в Discourse. -
Найдите группу Discourse, которую хотите связать. Перейдите в «Настройки» → «Членство» → «Автоматически», а затем выберите «Связанные группы» для связи. Этот выпадающий список заполняется информацией от провайдера идентификации, поэтому для появления опции хотя бы один член группы должен войти в систему.
Пример настройки
Здесь мы настроим плагин openid-connect для подключения к провайдеру OpenID Connect Google. Это повторяет функциональность, уже существующую в ядре Discourse, но служит доступным примером.
-
Перейдите на OpenID Connect | Sign in with Google | Google for Developers и следуйте инструкциям для получения учетных данных OAuth.
-
На той же странице следуйте инструкциям для добавления URI перенаправления. Он должен быть
https://<ваш_форум>/auth/oidc/callback(без завершающего слеша). -
Перейдите в настройки вашего сайта Discourse и найдите «openid_connect»
-
openid connect enabled: [x] -
openid connect discovery document:https://accounts.google.com/.well-known/openid-configuration -
openid connect client id:<id_клиента> -
openid connect client secret:<секрет_клиента> -
openid connect authorize scope:
openid email(с пробелом между ними)
-
-
Готово. Кнопка «Войти с помощью OpenID Connect» теперь будет входить через Google
. Эти же шаги можно применить к другим провайдерам с минимальными изменениями.
Отладка
В дополнение к параметру verbose_logging, описанному выше, вы можете получить данные о связях OIDC с помощью плагина data-explorer:
SELECT user_id, provider_name, provider_uid
FROM user_associated_accounts
WHERE provider_name = 'oidc'
Или в консоли Rails:
User.find_by_username("david").user_associated_accounts.where(provider_name: 'oidc')
Примечания для конкретных провайдеров
Пожалуйста, не стесняйтесь обновлять этот раздел, если вы обнаружите какие-либо особенности, специфичные для провайдера, связанные с этой интеграцией:
Entra ID (ранее Azure AD)
Добавьте область email и убедитесь, что вы используете документ конфигурации конечной точки версии 2. Например:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
Azure B2C
Подробности URL документа обнаружения можно найти здесь: Web sign in with OpenID Connect - Azure AD B2C | Microsoft Learn
Чтобы заработала отправка писем:
Yahoo
-
Перейдите на https://developer.yahoo.com/apps и создайте новое приложение.
-
Введите имя приложения и установите домен обратного вызова в домен вашего форума (например,
meta.discourse.org). -
В разделе «Разрешения API» выберите Profiles: Read/Write Public and Private. Это единственный известный мне способ получения адреса электронной почты пользователя.
-
Сохраните приложение.
-
В настройках OIDC Discourse установите документ обнаружения в:
https://login.yahoo.com/.well-known/openid-configuration -
Введите ID клиента и секрет от Yahoo.
-
Включите плагин OIDC.
AWS Cognito
- Перейдите в Cognito и выберите или создайте новый пул пользователей.
- Определите приложение в разделе «Клиенты приложений».
- Оставьте всё по умолчанию, но измените конфигурацию потоков аутентификации, выбрав только ALLOW_REFRESH_TOKEN_AUTH.
- Перейдите в настройки клиента приложения и выберите новое приложение.
- Измените URL обратного вызова на https://yoursite.example.com/auth/oidc/callback.
- Отметьте только поток предоставления авторизационного кода среди «Разрешенных потоков OAuth».
- Отметьте все необходимые области (я отметил все).
Okta
-
Настройте Discourse с ID клиента и секретом вашего приложения Okta.
-
Установите URL документа обнаружения в:
https://{ваше_приложение}.okta.com/.well-known/openid-configuration -
В Discourse установите
openid connect authorize scopeвopenid email.
Размещено нами? Этот плагин доступен в наших тарифных планах Business и Enterprise. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion
Нужно автоматизировать регистрацию пользователей? См. Auto-provisioning user accounts when SSO is enabled


