Блокировка НЕКОТОРЫХ, но не всех конечных точек в WordPress rest api

#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));
        
        }
        
    }

});