Привет! Я пытаюсь получить список групп, в которые входит пользователь. Казалось бы, эту информацию можно получить через функцию get_discourse_user, но она, похоже, не возвращает никаких данных о группах. Согласно этому посту, она должна это делать?
Вы вызываете функцию WP Discourse get_discourse_user? Если да, то она должна возвращать группы пользователя в массиве "groups".
Да, я вызываю его следующим образом.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
И он возвращает следующее
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
Параметр true в вызове функции заставляет её искать пользователя на Discourse по его адресу электронной почты, если пользователь не найден по идентификатору пользователя WordPress. Это означает, что пользователь ещё не входил в Discourse через SSO. Когда пользователь найден по адресу электронной почты, возвращается меньше информации от Discourse, чем при поиске по идентификатору пользователя WordPress.
Возможно, функцию можно улучшить, чтобы сделать возвращаемое значение более понятным. На данный момент, если в ответе отсутствует массив groups, это означает, что пользователь был найден по адресу электронной почты.
Понял. Спасибо за объяснение, Саймон!
Привет, Саймон,
Я вошел в Discourse через SSO и вижу эту ошибку при установке параметра email в значение false.
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "Пользователя Discourse не удалось получить." } } ["error_data"]=> array(0) { } }
При установке в значение True группы всё равно не возвращаются.
Чуть запутался: конфигурация SSO позволяет мне войти в WordPress и Discourse (также можно выйти из обоих через WordPress), поэтому всё должно работать как ожидается, но группы всё равно не отображаются.
Когда вы устанавливаете второй параметр вызова функции в false или просто опускаете этот параметр (по умолчанию он равен false), функция попытается получить данные пользователя из Discourse по его идентификатору WordPress. Если пользователь уже авторизовался в Discourse через SSO, функция должна вернуть информацию о пользователе и его группах.
Для отладки перейдите на страницу администратора пользователя в Discourse, которого вы пытаетесь получить. Прокрутите страницу до самого низа и проверьте, есть ли там раздел «Single Sign On». Если он есть, убедитесь, что значение External ID в этом разделе совпадает с идентификатором пользователя WordPress, который вы используете при вызове get_discourse_user.
Если на странице администратора пользователя в Discourse нет раздела «Single Sign On», значит, пользователь ещё не авторизовался в Discourse через SSO.
Да, я не вижу, чтобы этот раздел существовал ни для одного из протестированных мной пользователей.
Хотя мне действительно кажется, что я вхожу через SSO.
Вот как выглядит процесс. (не выполнен вход в WordPress или Discourse)
На WordPress я нажимаю на ссылку «Войти через Discourse»
Меня перенаправляют на сайт Discourse
Я ввожу свои учётные данные Discourse
Успешно перенаправляюсь обратно на сайт WordPress
Теперь я выполнен вход в оба сайта
Чего мне не хватает в этом процессе, чтобы это официально считалось SSO?
Теперь я вижу проблему. Вы используете Discourse как провайдера SSO для WordPress. Эта функция предназначена для случая, когда WordPress выступает провайдером SSO для Discourse. Функция названа неудачно. Её название должно чётко указывать на сценарий использования.
Для случая, когда Discourse является провайдером SSO для WordPress, вам нужно выполнить аутентифицированный API-запрос к /admin/users/$user_id.json. Переменная $user_id должна быть установлена в ID пользователя в Discourse. Для пользователей, вошедших в WordPress через Discourse, их ID в Discourse можно получить следующим образом:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
А, хорошо. Я начну изучать вашу документацию по API. Спасибо, что указали мне правильное направление!