Как сделать аутентификацию в php файле при использовании WP REST API?

Ссылка скопирована
1 ответ

Пишу вордпресс плагин добавляющий кнопку пайпал. В нем будет несколько php файлов не связанные с вордпресс. В интернете я встретила следующее сообщение: "вы никогда не должны делать прямые вызовы PHP-файлов внутри темы или плагина, это серьезная проблема безопасности" и там же было написано что нужно использовать WP REST API. Я сделала это и все работает. Только есть одна проблема - для получении данных при помощи WP REST API необходимы логин и пароль пользователя:
CURLOPT_USERPWD => "$login:$password"
Для проверки работы API я использовала логин и пароль, но я прочитала что этого делать в готовых проектах не рекомендуется.
Существует еще OAuth, но для него вроде бы придется использовать форму входа, что для плагина будет выглядеть странно.
Я хочу узнать - действительно ли отдельные пхп файлы не нужно подключать в вордпресс? Если они действительно должны существовать отдельно как быть с аутентификацией - потому что без нее не знаю как работать с REST API?

Дополнительно

А создать условие для работы плагина только для аунтифицированных пользователей, вера не позволяет)

  • Срочно изучать матчасть https://developer.wordpress.org/rest-api/ и wp-kama.ru/handbook/rest/basic/authentication/appl...
  • Спасибо за ответ. Использовать встроенную функцию аутентификации - а она будет работать в этих отдельных файлах?
    А вот это "Basic Authentication with Application Passwords" работает только для приложений? Для плагинов не подходит?
  • AlXan, Пароли приложений - мне на wordpress.org сказали что это конкретно для приложений, а не для плагинов.
  • Вера, конечно для плагина, берущего что-то со СВОЕГО сайта они не нужны - плагин УЖЕ есть часть этого сайта. Но у тебя вопрос по аутентификации по REST-API и про "несколько php файлов не связанные с вордпресс." Так что определись чего ты хочешь - делать нормальный плагин или использовать REST-API из левых файлов (левых - в см никак не связанных с ВП. Те это и есть стороннее приложение)
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция Security Ответ

    При обращении к WP REST API из отдельного PHP-файла нужно использовать нормальную авторизацию, а не просто подключать wp-load.php и считать пользователя авторизованным. Для серверного запроса самый простой вариант — Application Passwords WordPress.

    Создайте пароль приложения в профиле пользователя WordPress и отправляйте запрос с Basic Auth:

    $username = 'admin';
    $app_password = 'xxxx xxxx xxxx xxxx xxxx xxxx';
     
    $response = wp_remote_get('https://site.ru/wp-json/wp/v2/posts', [
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode($username . ':' . $app_password),
        ],
    ]);

    $username = 'admin'; $app_password = 'xxxx xxxx xxxx xxxx xxxx xxxx'; $response = wp_remote_get('https://site.ru/wp-json/wp/v2/posts', [ 'headers' => [ 'Authorization' => 'Basic ' . base64_encode($username . ':' . $app_password), ], ]);

    Если PHP-файл находится вне WordPress, можно использовать cURL:

    $ch = curl_init('https://site.ru/wp-json/wp/v2/posts');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Basic ' . base64_encode($username . ':' . $app_password),
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);

    $ch = curl_init('https://site.ru/wp-json/wp/v2/posts'); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Basic ' . base64_encode($username . ':' . $app_password), ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch);

    Для фронтенда Application Passwords не подходят: их нельзя отдавать в браузер. Там используют cookie + nonce для авторизованного пользователя или OAuth/JWT, если проект это требует.

    Если задача — вызвать REST API внутри WordPress, чаще лучше не делать HTTP-запрос к самому себе, а вызвать нужную функцию напрямую. REST нужен для внешних клиентов и интеграций.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно