Баг или так задумано c /wp-json/wp/v2/users ?
-
Столкнулся что запросы от анонима типа /wp-json/wp/v2/users/1 кого-то отображают, кого-то нет — запрещено.
Копнул в кодА там проверка почему-то привязана к числу публикаций запрашиваемого пользователя. Если у того 0 публикаций — то информация по нему отдается. Иначе запрещено.
Разве это правильно?
-
Если у того 0 публикаций — то информация по нему отдается. Иначе запрещено.
Если нет публикаций, то информация отдаётся только тем, у кого есть права на просмотр или редактирование пользователей, иначе — не отдаётся:
} elseif ( ! count_user_posts( $user->ID, $types ) && ! current_user_can( 'edit_user', $user->ID ) && ! current_user_can( 'list_users' ) ) { return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) ); }
Если публикации есть, то профиль автора считается публичным и информация отдаётся всегда.
@sergeybiryukov, спасибо, действительно наоборот, но не важно. Я тут пытался скрыть реального администратора, но и его стали брутфорсить, оказалось, что апи с удовольствием сообщает что пользователя нет — 404, доступ к просмотру запрещен — 401, или публичный 200. Не мудрено что перебрали ID. Хотелось бы не закрывать регистрацию и вход по АПИ, наверное нужно внедрять свою проверку в фильтр rest_authentication_errors https://developer.wordpress.org/rest-api/frequently-asked-questions/#require-authentication-for-all-requests
igor-san,
действительно наоборот, но не важно
Учитывая, что вы пытаетесь разобраться в ситуации и придумать своё решение, то, по идее, это должно быть важно.
Нашли решение своей задачи?
@m0ze, решил как смог (что-то извещения о цитировании тут не работают, случайно заметил обращение) — добавил проверку на свои пути для регистрации, остальные только для авторизованных
add_filter( 'rest_authentication_errors', 'rest_authentication_errors'); function rest_authentication_errors( $result ) { //https://developer.wordpress.org/rest-api/frequently-asked-questions/ $allow = ["/wp-json/wp/v2/users/register", "/wp-json/wp/v2/users/checklogin", "/wp-json/wp/v2/users/lostpassword"]; if ( ! $result && in_array($_SERVER['REQUEST_URI'], $allow)) { //null еще не залогинились, но может это наши пути return true; //разрешаем } // If a previous authentication check was applied, // pass that result along without modification. if ( true === $result || is_wp_error( $result ) ) { return $result; } // No authentication has been performed yet. // Return an error if user is not logged in. if ( ! is_user_logged_in() ) { return new WP_Error( 'rest_not_logged_in', __( 'You are not currently logged in.' ), array( 'status' => 401 ) ); } return $result; }
- Тема «Баг или так задумано c /wp-json/wp/v2/users ?» закрыта для новых ответов.