Удаление аватара пользователя через API

Здравствуйте!

У нас есть приложение форума Discourse, подключенное к нашему приложению через SSO. Аватары пользователей обновляются непосредственно через него. Однако наши фотографии проходят модерацию, поэтому нам необходимо очищать аватары пользователей на стороне приложения Discourse.

Можно ли это сделать каким-либо образом через REST API или с помощью улучшений механизма SSO? Я не могу найти эту информацию в документации.

Спасибо!

Вы должны иметь возможность вызвать маршрут sync_sso, чтобы повторно синхронизировать аватар пользователя. Однако вы также можете отправить PUT-запрос на http://localhost:3000/u/<username>/preferences/avatar/pick с пустым upload_id

чтобы удалить текущий аватар пользователя и назначить ему аватар с буквой.

@blake Ошибка при отправке этого запроса. Я использовал POST-запрос.
{
“failed”: “FAILED”
}

Вы пробовали сделать PUT, как рекомендовали?

@pfaffman извините, я использовал put

Если у вас включена опция sso overrides avatar, вам нужно будет использовать endpoint sync_sso.

Мы используем конечную точку SSO, но она обновляет аватар пользователя только при входе. В нашем случае требуется обновлять его вручную.

Да, всё отлично. Вы можете вручную выполнить POST-запрос к конечной точке sync_sso в любое время.

Не могли бы вы прикрепить ссылку на документацию API для этого эндпоинта?

Вот пример кода на Ruby с использованием гема discourse_api, который вы можете использовать в качестве справочного материала. Эндпоинт sync_sso немного отличается от других, так как вам нужно отправлять ему подписанную полезную нагрузку.

client = DiscourseApi::Client.new('host')
client.api_key = 'api_key'
client.api_username = 'api_username'
puts client.sync_sso(
  sso_secret: 'abcdefghij',
  username: '24db27218ed09205a5a0',
  name: '24db27218ed09205a5a0',
  email: '24db27218ed09205a5a076983bf241ab@example.com',
  external_id: '684',
  avatar_url: 'https://d3bpeqsaub0i6y.cloudfront.net/user_avatar/meta.discourse.org/codinghorror/240/110067_2.png',
)

Правильно ли я понимаю, что мы можем отправлять запрос POST /admin/users/sync_sso?api_key=...&api_username=...&sso=...&sig=...?
Аналогичны ли параметры sso и sig тем, что используются в потоке авторизации SSO?

Я попытался выполнить запрос, как описано выше: POST /admin/users/sync_sso?api_key=...&api_username=...&sso=...&sig=.... Сервер ответил кодом 200 с данными моего пользователя, но аватар пользователя не обновился, и в логах не появилось никаких событий. Что я делаю не так?

Вы должны включить api_key и api_username в заголовок HTTP, поскольку использование их в параметрах запроса устарело.

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

Я заменил учетные данные API на заголовки. Синхронизация SSO не обновила аватар пользователя на предоставленный. При этом задача Sidekiq в этом вызове была выполнена, и в логах не было ошибок или предупреждений.

Вы можете включить подробное логирование SSO в настройках сайта, чтобы проверить, появится ли там какая-либо информация.

Является ли указанный вами avatar_url общедоступным? Ваш сайт Discourse должен иметь возможность получать к нему доступ.