Я пытаюсь использовать WordPress Rest Api с аутентификацией, чтобы получить больше данных от API. Я установил плагин Oauth, плагин rest-api и получил учетные данные API от WP-CLI.
Я понял, как получить доступ к данным без авторизации. Это работает:
// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/";
$curl = curl_init($endpoint);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);
?>
<pre>
<?php print_r($decoderesponse); ?>
</pre>
Но я не могу понять, как пройти аутентификацию с помощью учетных данных. Вот моя попытка. Я не уверен, что «ключ» и «секрет» верны.
// Oauth credentials from wp-cli
$ID = "4";
$Key = "l8XZD9lX89kb";
$Secret = "UUbcc8vjUkGjuDyvK1gRTts9sZp2N8k9tbIQaGjZ6SNOyR4d";
// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/1/revisions";
$headers[] = "key=$Key";
$headers[] = "secret=$Secret";
$curl = curl_init($endpoint);
curl_setopt_array($curl, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);
?>
<pre>
<?php print_r($decoderesponse); ?>
</pre>
Выход
Array
(
[code] => rest_cannot_read
[message] => Sorry, you cannot view revisions of this post.
[data] => Array
(
[status] => 401
)
)
Как я могу заставить это работать? Спасибо.
authentication
rest-api
curl
JediTricks007
источник
источник
Ответы:
Давайте пойдем шаг за шагом здесь. Похоже, вы пытаетесь использовать OAuth только для аутентификации, но прежде чем вы сможете это сделать, вам нужно получить токен доступа, который будет использоваться для аутентификации при выполнении вызовов API.
Поскольку для этого используется OAuth версии 1, для получения токена доступа необходимо выполнить следующее:
Я рекомендую использовать Почтальон для первых нескольких шагов, потому что они должны быть выполнены только один раз. Почтальон также будет обрабатывать генерацию
timestamp
,nonce
иoauth signature
, если вы не используете библиотеку OAuth, то вам обязательно следует использовать Почтальон. Получив токен доступа, вы можете совершать звонки через CURL без каких-либо библиотек.https://www.getpostman.com/
Первый шаг (настройка приложения)
Установите плагин WP OAuth 1, активируйте его, затем перейдите в пункт меню « Пользователи»> «Приложения» . Добавить новую заявку, заполнить имя и описание. Для обратного вызова либо URL-адрес, на который перенаправляется пользователь (после авторизации), либо
oop
внеполосный поток, который перенаправляет на внутреннюю страницу, на которой отображается токен верификатора (вместо перенаправления).https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md
Для того, чтобы перейти ко второму шагу должен быть сделан на ваш сайт, используя вызов ID клиента и секрет клиента из созданного приложения, чтобы получить временные данные (идентификатор запроса).
Откройте Почтальон, создайте новый вызов
http://website.com/oauth1/request
, нажмите на вкладку Авторизация, выберите OAuth 1.0 из раскрывающегося списка, введите ключ клиента, Client Secret, установите метод подписи наHMAC-SHA1
, разрешите добавлять параметры в заголовок, кодируйте подпись oauth , затем нажмите « Обновить запрос».Почтальон автоматически сгенерирует подпись, одноразовый номер и временную метку для вас, и добавит их в заголовок (вы можете просмотреть на вкладке Заголовки).
Нажмите «Отправить», и вы должны получить ответ, который включает
oauth_token
иoauth_token_secret
:Эти значения будут использованы на следующем шаге для авторизации приложения под вашей учетной записью WordPress.
Второй шаг (авторизовать приложение)
Шаг авторизации необходимо выполнить только один раз, этот шаг ориентирован на пользователя и знаком всем. Этот шаг необходим, потому что вы используете OAuth1, и приложение должно быть связано с учетной записью пользователя WordPress. Подумайте, когда сайт позволяет вам войти через Facebook ... они направляют вас в Facebook, где вы входите, и нажимаете «Авторизовать» ... это нужно сделать, просто через ваш сайт WordPress.
Я рекомендую использовать ваш веб-браузер для этого шага, так как вы можете легко установить переменные в URL, и это обеспечивает страницу «Авторизация» для авторизации приложения.
Откройте веб-браузер и введите URL-адрес своего сайта, например:
http://website.com/oauth1/authorize
Теперь добавьте к этому URL
oauth_consumer_key
(идентификатор клиента)oauth_token
иoauth_token_secret
(с предыдущего шага). В моем примере это полный URL:После того, как вы нажмете «Авторизовать», вы получите другой экран с токеном подтверждения. В моем примере это возвращенный токен подтверждения
E0JnxjjYxc32fMr2AF0uWsZm
Третий шаг (получить токен доступа)
Теперь, когда мы авторизовали приложение, нам нужно сделать один последний вызов, чтобы получить токен авторизации, который будет использоваться для выполнения всех ваших вызовов API. Так же, как на первом шаге я собираюсь использовать Почтальон (потому что подпись должна быть HMAC-SHA1), и это облегчает выполнение этих шагов в 100 раз.
Снова откройте Почтальон и измените URL на
http://website.com/oauth1/access
Не забудьте добавить токен и секрет токена (значения с первого шага), затем нажмите « Параметры», чтобы отобразить поля под URL-адресом. Слева введите oauth_verifier и справа введите код со второго шага, верификационный токен
Убедитесь в том , чтобы нажать Update Request, а затем нажмите кнопку Отправить, и вы должны получить ответ обратно с
oauth_token
иoauth_token_secret
... это то , что вам нужно сделать API вызовы с! Откажитесь от оригинальных с шага 1, сохраните их в своем коде или в другом безопасном месте.Затем вы можете сделать API-вызов на ваш сайт, установив заголовки с возвращенным токеном и секретом токена.
Вы можете передать это несколькими способами, через заголовок авторизации, в параметрах GET или POST (если он закодирован как application / x-www-form-urlencoded). Имейте в виду, что вы ДОЛЖНЫ передать подпись, отметку времени и одноразовый номер. Я не осознавал, сколько времени займет этот ответ, поэтому я обновлю это завтра с примером того, как сделать это с вашим кодом.
Я настоятельно рекомендую установить журнал Rest API, чтобы вы могли просматривать журнал вызовов API и видеть, что было отправлено, возвращено и т. Д. Это очень поможет при отладке.
https://github.com/petenelson/wp-rest-api-log
источник
Добавление этого в качестве другого ответа, чтобы помочь вам выяснить, как это сделать. В основном, как упоминалось в моих комментариях, если вы собираетесь использовать OAuth1, вы ДОЛЖНЫ связать его с учетной записью пользователя, никак не обойтись.
Сначала вам нужно использовать CURL для входа на сайт с паролем имени пользователя для WordPress, сохраните cookie-файл, чтобы вы могли использовать его в своем вызове CURL для OAuth (не забудьте обновить свой вызов CURL, чтобы включить cookie):
/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php
Затем выполните вызов OAuth с использованием CURL с идентификатором клиента и секретом клиента, чтобы получить временный токен oauth и секрет (запрос токена)
Чтобы сделать этот вызов (и вызов для получения токена доступа), вам необходимо правильно настроить вызов CURL. Смотрите конец этого ответа для кода и ссылок.
После того, как вы получите временный токен oauth и секрет (Request Token), сделайте вызов CURL POST по этому URL вашего сайта:
http://website.com/oauth1/authorize
Затем вам нужно будет извлечь все значения из возвращенного HTML-кода для страницы авторизации, а затем отправить свой собственный POST по URL-адресу действия формы.
/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl
В частности, они должны быть включены в ваши данные POST, чтобы завершить «авторизацию» POST для
http://domain.com/wp-login.php?action=oauth1_authorize
_wpnonce
- Это одноразовое значение для формы, которая должна быть отправлена, она ДОЛЖНА быть извлечена из HTML-ввода и отправлена с вашим POSTconsumer
- Это скрытый ввод в HTML (это ссылка на идентификатор сообщения, поэтому вы должны извлечь его из ввода HTMLoauth_token
- Это скрытый ввод в HTML (но он также должен быть у вас)wp-submit
- Это должно быть установлено в значениеauthorize
Вот пример HTML-кода, сгенерированного для страницы аутентификации:
После того, как вы выполните POST со всеми этими значениями / данными, это HTML, который будет возвращен с кодом авторизации (поэтому вам нужно извлечь значение изнутри
<code>
блока:Получив токен подтверждения, вы можете позвонить,
/oauth1/access
используя токен подтверждения, токен oauth и токен oauth. Токен подтверждения должен быть помещен в данные POST какoauth_verifier
Это вернет ваш новый и постоянный токен доступа, и VOILA!
Пример кода CURL
Ниже приведен пример кода для вызова CURL, наиболее важной частью которого является то, как
oauth_signature
генерируется:https://oauth1.wp-api.org/docs/basics/Signing.html
На этом сайте подробно рассказывается, как кодировать подпись OAuth и как отправлять сообщения с использованием CURL (я рекомендую прочитать всю страницу): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- данные/
Дополнительный ресурс по созданию подписи OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1
Другие ресурсы: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/
источник
oauth_signature
как вы сказали, но, так или иначе, ответ всегдаjson_oauth1_signature_mismatch
.Обновление: из того, что я прочитал, вам нужно сделать несколько скручиваний, чтобы получить access_token, который вы затем используете для выполнения запроса
oauth1 серверный поток
источник
Я знаю, что вхожу в это немного поздно, но вы можете использовать wp_remote_get и _post?
Я извлекаю и публикую контент с моей установкой WordPress, используя их:
Это общая идея из кодекса WordPress:
Вот более конкретный пример:
Хитрость заключается в кодировании имени пользователя и pw. Теперь время, зависящее от имени пользователя API и pw, будет либо пустым, либо будет вашим токеном.
так, например, в моем конкретном примере выше, заголовки были
и я оставил pw пустым. Это зависит от системы API, которую вы используете.
источник