Базовый OAuth2 для Discourse

:discourse2: Краткое содержание Discourse OAuth2 Basic поддерживает базовых провайдеров OAuth2, предполагая наличие у них JSON-эндпоинта, через который можно получить данные пользователя по токену.
:open_book: Руководство по установке Этот плагин включён в ядро Discourse. Отдельная установка плагина не требуется.

Возможности

Этот плагин позволяет использовать базового провайдера OAuth2 для аутентификации в Discourse. Он должен работать со многими провайдерами при условии, что они предоставляют JSON-эндпоинт для получения информации о пользователе, который входит в систему.

Это в основном полезно для тех, кто использует провайдеров входа, которые не очень популярны. Если вы хотите использовать Google, Facebook или Twitter, они уже включены по умолчанию, и вам не нужен этот плагин. Вы также можете поискать других провайдеров входа в нашем репозитории на Github.

Настройка

Базовая настройка

  1. Сначала зарегистрируйте ваше приложение Discourse у вашего провайдера OAuth2. Вам потребуется указать Redirect URI, который будет следующим:

    http://DISCOURSE_HOST/auth/oauth2_basic/callback

:information_source: Замените DISCOURSE_HOST на соответствующее значение и убедитесь, что вы используете https, если он включён. Провайдер OAuth2 должен предоставить вам client ID и secret, а также несколько URL-адресов.

  1. Перейдите в АдминистрированиеНастройкиВход через OAuth2 и заполните базовую настройку для провайдера OAuth2:
  • oauth2_enabled - отметьте этот пункт, чтобы включить функцию
  • oauth2_client_id - идентификатор клиента от вашего провайдера
  • oauth2_client_secret - секретный ключ клиента от вашего провайдера
  • oauth2_authorize_url - URL авторизации вашего провайдера
  • oauth2_token_url - URL токена вашего провайдера.

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

Настройка JSON-эндпоинта пользователя

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

Нам нужен API-эндпоинт, через который можно получить информацию о пользователе на основе токена.

Например, провайдер OAuth2 SoundCloud предоставляет такой URL. Если у вас есть токен OAuth2 для SoundCloud, вы можете отправить GET-запрос к https://api.soundcloud.com/me?oauth_token=A_VALID_TOKEN и получите JSON-объект с информацией о пользователе.

Чтобы настроить это в Discourse, нам нужно установить значение настройки oauth2_user_json_url. В данном случае мы введем следующее значение:

https://api.soundcloud.com/me?oauth_token=:token

Часть с :token указывает Discourse, что это значение нужно заменить на токен авторизации, полученный после завершения аутентификации.

Остался один последний шаг. Нам нужно сообщить Discourse, какие атрибуты доступны в полученном JSON. Вот пример ответа от SoundCloud:

{
  "id": 3207,
  "permalink": "jwagener",
  "username": "Johannes Wagener",
  "uri": "https://api.soundcloud.com/users/3207",
  "permalink_url": "http://soundcloud.com/jwagener",
  "avatar_url": "http://i1.sndcdn.com/avatars-000001552142-pbw8yd-large.jpg?142a848",
  "country": "Germany",
  "full_name": "Johannes Wagener",
  "city": "Berlin"
}

Переменные oauth2_json_user_id_path, oauth2_json_username_path, oauth2_json_name_path и oauth2_json_email_path должны быть установлены так, чтобы указывать на соответствующие атрибуты в JSON.

Единственным обязательным атрибутом является id — он нам нужен, чтобы при последующем входе пользователя мы могли найти правильный аккаунт. Остальные атрибуты полезны, если они доступны — они ускорят процесс регистрации пользователя, так как поля будут автоматически заполнены в форме.

Вот как я настроил параметры путей JSON:

  oauth2_json_user_id_path: 'id'
  oauth2_json_username_path: 'permalink'
  oauth2_json_name_path: 'full_name'

Я использовал permalink, потому что он кажется более похожим на то, что Discourse ожидает в качестве имени пользователя, чем поле username в их JSON. Обратите внимание, что я не указал путь к электронной почте: SoundCloud не предоставляет email, поэтому пользователю придётся ввести и подтвердить его при первой регистрации в Discourse.

Если нужные вам свойства в JSON-объекте вложены друг в друга, вы можете использовать точки. Например, если API возвращает структуру такого вида:

{
  "user": {
    "id": 1234,
    "email": {
      "address": "test@example.com"
    }
  }
}

Вы можете использовать user.id для oauth2_json_user_id_path и user.email.address для oauth2_json_email_path.

Если сам ключ содержит точки, его нужно заключить в двойные кавычки или экранировать точки обратным слэшем. Например, для следующего JSON:

{
  "example.com/uid": "myuid"
}

вы укажете путь как example\.com/uid или "example.com/uid".

Синхронизация групп и полей пользователя

  • oauth2_json_groups_path: путь в JSON, содержащий группы пользователя в виде массива строк. После первого входа эти группы станут доступны для выбора в разделе «Связанные группы» настроек групп Discourse. Оставьте пустым, чтобы отключить синхронизацию групп.

  • oauth2_user_field_mappings: сопоставление путей в JSON, которые будут сохранены в пользовательских полях Discourse. Пользовательские поля идентифицируются по их числовому ID, который можно найти в URL при их редактировании через панель администратора.

:warning: Если вы установили oauth2_json_email_path, провайдер OAuth2 должен подтвердить, что пользователь владеет этим адресом электронной почты. Невыполнение этого требования может привести к захвату аккаунта в Discourse!

:discourse2: Размещено у нас? Этот плагин доступен в наших тарифах Business и Enterprise. OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion

:spiral_notepad: Нужно автоматизировать регистрацию пользователей? См. Auto-provisioning user accounts when SSO is enabled

28 лайков
Keycloak with Discourse
Discourse SSO with OAuth2
Login from another user database
Shopify Integration
How can we enable Auth0 SSO in Discourse
OAuth2 integration with Drupal
OAuth connection of discourse
Login flow (Flask -> Discourse -> Flask) with OAuth
How to use Oauth2 service provided by discourse?
How to login to discourse from external website
Is "partial" SSO possible?
Set up Salesforce auth using OAuth2 basic support plugin
How to force users link phone number when they using Discourse?
OAuth2 Custom Redirects Plugin
Custom Login / Registration from another API
Login on discourse using mastodon credentials
Open source will support customized provider SSO
Oauth2 with fusionauth cert issues
Auto-provisioning user accounts when SSO is enabled
Configure sign up and log in with Auth0 using the OAuth2 Basic Plugin
SSO with TownNews CMS
What is supposed to go in “DISCOURSE_HOST”?
Custom Provider log-in with OAuth only sign-up/log-in
Discord, Google and Microsoft login, is oAuth2 enough?
Populating email field on login page
CodeBerg support
Gate our community to just members of our Shopify site?
Intergrate Discourse with keycloak
Integration into custom auth system where emails are not unique?
Twitter login doesn't work on meta
Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)
Question about Docker Manager?
Discourse OpenID Connect (OIDC)
🧩 How to Build an Android App User Community with Discourse? [HeyApks Project]
Bundling more popular plugins with Discourse core
Drupal 8 and Discourse shared SSO
Discourse for self hosting
Discourse + Intercom (Current User Id)
Error during SSO integration - Wholistic Minds
ADFS Authentication
Pulling user auth0 sub from OAuth2.0 plugin
Suggestion for improving Integrated Authentication development
Github and Twitter Login/Sign-Up Functionality?
Automatically creating a user when logging in with Webflow/Memberspace
Switching out authentication for a passwordless alternative
Removing Yahoo login from Core, and deprecating OpenID 2.0
Shopify Integration
SSO and Auth0
Migrate a Jive Clearspace forum to Discourse