Как настроить интеграцию с Salesforce

:bookmark: В этом руководстве описаны шаги конфигурации, необходимые для подключения Discourse к Salesforce с помощью плагина Discourse Salesforce.

:discourse: Discourse Salesforce доступен на тарифном плане Enterprise.

:person_raising_hand: Требуемый уровень пользователя: Администратор

Шаг 0: Определение ответственных в вашей организации

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

Администратор Salesforce

Кто это: В большинстве организаций это тот, кого ваша команда называет «администратором Salesforce» — человек, управляющий конфигурацией вашей организации Salesforce, а не обязательно системный администратор ИТ.

Что они делают: Выполняют первоначальную настройку на стороне Salesforce: создают External Client App (или Connected App) в разделе Setup, настраивают параметры OAuth и получают Consumer Key и Consumer Secret.

Что им нужно: Доступ к разделу Setup в Salesforce, в частности к External Client App Manager. В Salesforce для этого требуется системное разрешение Customize Application. Оно включено в стандартный профиль System Administrator. Если человек, выполняющий настройку, не имеет профиля System Administrator, администратору Salesforce необходимо выдать ему набор разрешений, включающий «Customize Application».

Интеграционный пользователь Salesforce

Кто это: Пользователь Salesforce, учетные данные которого используются плагином Discourse для выполнения вызовов API к Salesforce.

Что они делают: Предоставляют имя пользователя для поля salesforce username в настройках плагина Discourse Salesforce, чтобы обеспечить все вызовы API из Discourse в Salesforce.

Что им нужно: У этого пользователя должны быть следующие разрешения:

Разрешение Почему это необходимо
API Enabled Требуется для любого доступа к API Salesforce
Create, Read, Edit on Lead Создание и привязка Лидов (Lead) из пользователей Discourse
Create, Read, Edit on Contact Создание и привязка Контактов (Contact) из пользователей Discourse
Create, Read, Edit on Case Создание дел (Case) из тем Discourse
Create on Case Comment Синхронизация ответов в темах как комментариев к делам (Case Comments)
Create on FeedItem (Chatter) Публикация активности темы в Chatter

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

Шаг 1: Генерация сертификата и приватного ключа

Роль: Администратор Discourse

Плагин Discourse Salesforce использует поток JWT Bearer для аутентификации в Salesforce. Это требует пару ключей RSA: публичный сертификат, который Salesforce использует для проверки идентификации плагина, и приватный ключ, который Discourse использует для подписи своих запросов.

  1. Следуйте этим инструкциям, чтобы сгенерировать пару ключей:
    • server.crt - публичный сертификат, подтверждающий, что Discourse является авторизованным приложением
    • server.key - приватный ключ, который подписывает API-запросы Discourse к Salesforce
  2. Отправьте файл server.crt вашему администратору Salesforce, чтобы он мог загрузить его на Шаге 3.
  3. Сохраните server.key для вставки в настройки плагина Discourse Salesforce на Шаге 5.

Шаг 2: Создание External Client App в Salesforce

Роль: Администратор Salesforce

  1. Войдите в Salesforce.

  2. Нажмите на значок шестеренки (:gear:) в правом верхнем углу и выберите Setup.

  3. В поле быстрого поиска (Quick Find) найдите External Client App Manager и выберите его.

  4. Нажмите New External Client App.

Примечание: Эти шаги используют External Client App Manager, представленный в Salesforce Spring '25. Если ваша организация работает на более ранней версии, интерфейс может отображать App Manager или Connected Apps — базовые настройки остаются теми же.

Шаг 3: Заполнение основной информации и настроек OAuth

Роль: Администратор Salesforce

  1. Заполните раздел Basic Information (поля App Name и Contact Email обязательны).

  2. Разверните раздел API (Enable OAuth Settings) и установите флажок Enable OAuth.

  3. Настройте следующие параметры в этом разделе:

    • Callback URL: Добавьте обе эти ссылки, заменив <your-discourse-site> на полный URL вашего сайта Discourse (например, meta.discourse.org):
      https://<your-discourse-site>
      https://<your-discourse-site>/auth/salesforce/callback
      :star: Убедитесь, что в конце ни одного из URL нет косой черты /!
    • Available OAuth Scopes: Добавьте все три:
      • Access the identify URL service (id, profile, email, address, phone)
      • Manage user data via APIs (api)
      • Perform requests at any time (refresh_token, offline_access)
    • Flow Enablement: Включите оба:
      • Enable Client Credentials Flow
      • Enable JWT Bearer Flow — это требуется для того, чтобы плагин мог создавать Лиды, Контакты и Дела
  4. В разделе Certificate Upload нажмите Upload files и загрузите файл server.crt из Шага 1.

  5. Нажмите Create.

Шаг 4: Получение Consumer Key и Consumer Secret

Роль: Администратор Salesforce

  1. На только что созданном External Client App перейдите на вкладку Settings.

  2. Прокрутите вниз и разверните раздел OAuth Settings.

  3. Нажмите Consumer Key and Secret.

  4. Введите повторно учетные данные для входа в Salesforce, когда об этом попросят.

  5. Скопируйте Consumer Key и Consumer Secret и отправьте их администратору Discourse для Шага 5.

Шаг 5: Настройка параметров плагина Discourse

Роль: Администратор Discourse

  1. В Discourse перейдите в Admin → Plugins → Salesforce → Settings.

  2. Заполните следующие настройки:

    Настройка Значение
    salesforce enabled Установите флажок, чтобы включить интеграцию
    salesforce client id Consumer Key из Шага 4
    salesforce client secret Consumer Secret из Шага 4
    salesforce rsa private key Вставьте полное содержимое файла server.key из Шага 1
    salesforce username Имя пользователя интеграционного пользователя Salesforce
    salesforce authorization server url Требуется только при использовании пользовательского домена Salesforce (например, https://mycompany.my.salesforce.com)

  3. Нажмите Save changes.

Шаг 6: Авторизация приложения Discourse в Salesforce

Роль: Интеграционный пользователь Salesforce

  1. Перейдите по адресу https://<your-discourse-site>/salesforce/admin/authorize, заменив <your-discourse-site> на полный URL вашего сайта Discourse (например, meta.discourse.org).
  2. Вы будете перенаправлены в Salesforce, где вам предложат авторизовать приложение.
  3. Войдите в Salesforce и предоставьте доступ приложению.

После выполнения этого шага все должно работать. Вы можете убедиться в этом, зайдя в профиль любого пользователя в Discourse — в меню администратора должна появиться опция Sync with Salesforce.

Устранение неполадок

Если плагин не работает после настройки, сначала проверьте следующее:

  • Проверки состояния на панели администратора: плагин выводит два предупреждения в /admin при неправильной конфигурации:

    • SalesforceInvalidCredentials: неверные Consumer Key, Consumer Secret, приватный ключ RSA или имя пользователя
    • SalesforceAppNotApproved: шаг авторизации (Шаг 6) не был выполнен, или связанное приложение было отклонено
  • Включите подробное логирование: включите настройку сайта salesforce_auth_verbose_logging, чтобы записывать подробный вывод аутентификации в /logs Discourse. Общие ошибки и их причины:

Симптом Вероятная причина
«Insufficient privileges» (недостаточно привилегий) при создании Лида или Контакта У интеграционного пользователя нет прав Create/Edit на объекты Lead или Contact
«Insufficient privileges» (недостаточно привилегий) при создании Дела У интеграционного пользователя нет прав на Case или Case Comment
«Invalid grant» (недопустимый грант) на этапе авторизации Ключ RSA не соответствует сертификату, загруженному на Шаге 3, или не был включен поток JWT Bearer
Ошибка «DUPLICATE_VALUE» при создании Лида или Контакта Ожидаемое поведение, если пользователь уже существует в Salesforce — плагин обрабатывает это, но подробнее смотрите в основной документации плагина
Посты Chatter не появляются У интеграционного пользователя может отсутствовать разрешение FeedItem Create