#endpoint #wordpress-rest-api
#конечная точка #wordpress-rest-api
Вопрос:
Я создаю приложение REACT, которое использует wordpress в качестве серверной части через rest API. Я использую плагин Simple-JWT-Login для обработки регистрации, входа в систему, аутентификации, и он работает отлично.
Я хочу заблокировать пользователям, не вошедшим в систему, доступ к конечной точке /wp/v2/posts. Я знаю, что могу сделать это, выполнив что-то вроде:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $resu<
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new WP_Error( 'rest_not_admin', 'You are not entitled to view that.', array( 'status' => 401 ) );
}
return $resu<
});
Однако это блокирует все конечные точки, в том числе ?rest_route=/simple-jwt-login/v1/auth
и ?rest_route=/simple-jwt-login/v1/users
те, которые находятся в плагине Simple-JWT-Login, используемом для регистрации и аутентификации пользователей. Поэтому пользователи попадают в ловушку 22, в результате чего они не могут войти в систему, если они уже не вошли в систему!
Есть ли способ изменить приведенный выше код, чтобы заблокировать только wp / v2 / posts / endpoint или, альтернативно, эффективно внести в белый список регистрирующие и аутентифицирующие конечные точки?
Большое спасибо за любые идеи!
Я искал здесь и в других местах, но не могу найти решение.
Комментарии:
1. Здравствуйте, при изучении wp rest API я столкнулся с той же проблемой. Вы наконец нашли решение? Я пытаюсь понять, как создать белый список конечных точек для решения этой проблемы
2. Извините за поздний ответ — не вижу уведомления. Нет, к сожалению, я так ничего и не добился. Если вы тем временем нашли решение, было бы здорово узнать!
Ответ №1:
Вы всегда можете проверить наличие URL-адреса, прежде чем показывать ошибку с помощью $ _SERVER[‘REQUEST_URI’], но это может стать проблемой для добавления всех ваших разрешенных URL-адресов при проверке if.
Мне нравится использовать apache_request_headers с preg_match для проверки токена на предъявителя, и если текущий запрос имеет правильный токен на предъявителя, покажите результаты. В противном случае вы выдадите ошибку. Я не могу гарантировать его 100% безопасность или правильный способ сделать это, но он работает довольно хорошо для супер простой простой системы.
Что-то вроде приведенного ниже кода может сработать для кого-то:
add_filter("rest_authentication_errors", function ($result) {
if (!empty($result)) {
return $resu<
}
$headers = apache_request_headers();
$matches = array();
$currentToken = "PUT YOUR BEARER TOKEN HERE";
$pattern = $currentToken."/i";
preg_match('/Bearer '. $pattern, $headers['Authorization'], $matches);
if(isset($matches)){
$token = $matches[0];
if($token == 'Bearer ' . $currentToken){
return $resu<
} else {
return new WP_Error( 'no_auth_found', 'You are not currently logged in.' , array( 'status' => 401));
}
}
});