Як використовувати автентифікацію OAuth з API REST за допомогою команд CURL?


18

Я намагаюся використовувати 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
        )
)

Як я можу змусити це працювати? Дякую.


2
Все не так просто. Я намагався написати відповідь, але це досить довго. Ви можете почати, прочитавши документи, спеціально Потік авторизації . Ці пости також мають чудовий підручник .
cybmeta

Відповіді:


10

Ходімо тут крок за кроком. Схоже, ви намагаєтесь використовувати OAuth лише для автентифікації, але перш ніж це зробити, вам потрібно отримати маркер доступу, який буде використовуватися для аутентифікації під час здійснення дзвінків API.

Оскільки для цього використовується OAuth версії 1, для отримання маркера доступу необхідно зробити наступне:

  1. Спочатку налаштуйте програму, зателефонуйте на сайт, щоб отримати маркер запиту (тимчасові облікові дані), використовуючи ідентифікатор клієнта та секрет для програми
  2. По-друге, зателефонуйте на сайт, щоб з першого кроку авторизувати додаток із запитом маркера (звернення до користувача, див. Нижче).
  3. По-третє, після завершення авторизації ви здійснюєте дзвінок на сайт, щоб отримати маркер доступу (тепер, коли заявку було дозволено)

Я рекомендую використовувати Postman протягом перших кількох кроків, оскільки їх потрібно виконати лише один раз. Поштальон також буде працювати з генеруванням timestamp, nonceі oauth signature, якщо ви не використовуєте бібліотеку OAuth, вам слід абсолютно використовувати Postman. Коли у вас є маркер доступу, ви можете здійснювати дзвінки через CURL без бібліотек.

https://www.getpostman.com/

Перший крок (налаштування програми)

Встановіть плагін WP OAuth 1, активуйте його, а потім перейдіть до пункту меню в розділі Користувачі> Програми . Додати нову заявку, заповнити назву та опис. Для зворотного дзвінка або URL-адресу для перенаправлення користувача на (після авторизації), або oopдля потоку поза межами діапазону, який перенаправить на внутрішню сторінку, на якій відображається маркер перевірки (замість перенаправлення).

https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md

Щоб перейти до другого кроку, вам потрібно здійснити виклик на ваш сайт, використовуючи ідентифікатор клієнта та секрет клієнта зі створеного додатку, щоб отримати тимчасові облікові дані (Запит жетону).

Відкрийте листоношу, створіть новий дзвінок http://website.com/oauth1/request, натисніть на вкладку Авторизація, виберіть зі спадного меню пункт OAuth 1.0, введіть Ключ клієнта, Клієнтський секрет, встановіть спосіб підпису HMAC-SHA1, увімкніть додавання парами до заголовка, кодування підпису Oauth та натисніть кнопку Оновити запит

Запит пошти OAuth1

Листоноша автоматично створить для вас підпис, без уваги та часові позначки та додасть їх до заголовка (можна переглянути на вкладці Заголовки).

Клацніть Надіслати, і вам слід отримати відповідь, що включає oauth_tokenта oauth_token_secret: Листоноша OAuth1 Запит відповіді

Ці значення будуть використані на наступному кроці для авторизації програми під вашим обліковим записом користувача WordPress.

Другий крок (авторизуйте додаток)

Крок авторизації потрібно виконати лише один раз, цей крок орієнтований на користувача та той, з яким всі знайомі. Цей крок необхідний, оскільки ви використовуєте OAuth1, і додаток потрібно пов’язати з обліковим записом користувача WordPress. Подумайте, коли сайт дозволяє вам увійти з Facebook ... вони направляють вас у Facebook, де ви входите та натискаєте "Авторизувати" ... це потрібно зробити, просто через ваш сайт WordPress.

Я рекомендую використовувати цей веб-браузер для цього кроку, оскільки ви можете просто встановити змінні в URL-адресі, і це надає сторінку "Авторизувати" для авторизації програми.

Відкрийте веб-браузер і введіть URL-адресу свого веб-сайту, наприклад: http://website.com/oauth1/authorize

Тепер додайте до цієї URL-адреси oauth_consumer_key((ID клієнта) oauth_tokenта oauth_token_secret(з попереднього кроку). У моєму прикладі це повна URL-адреса:

http://website.com/oauth1/authorize?oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=J98cN81p01aqSdFd9rjkHZWI&oauth_token_secret=RkrMhw8YzXQljyh99BrNHmP7phryUvZgVObpmJtos3QExG1O

Програма авторизації OAuth1

Після натискання кнопки "Авторизувати" ви отримаєте інший екран із маркером підтвердження. У моєму прикладі це повернений маркер підтвердженняE0JnxjjYxc32fMr2AF0uWsZm

Третій крок (отримати маркер доступу)

Тепер, коли ми авторизували додаток, нам потрібно зробити останній дзвінок, щоб отримати маркер авторизації, який буде використовуватися для здійснення всіх ваших дзвінків API. Так само, як і перший крок, я збираюся використовувати Postman (оскільки підпис повинен бути HMAC-SHA1), і це полегшує виконання цих кроків на 100 разів.

Відкрийте листоношу знову та змініть URL-адресу на http://website.com/oauth1/access

Не забудьте додати Token та Token Secret (значення з першого кроку), а потім натисніть Параметри, щоб показати поля під URL-адресою. Ліворуч введіть в oauth_verifier і праворуч введіть код з другого кроку, верифікатор перевірки

Поштальон OAuth1 Крок доступу

Переконайтесь, що натисніть Оновити запит, потім натисніть Надіслати, і вам слід отримати відповідь, oauth_tokenі oauth_token_secret... це те, що вам потрібно для здійснення дзвінків API! Відкиньте оригінали з кроку 1, збережіть їх у своєму коді чи в іншому місці безпеки.

Відповідь доступу на пошту OAuth1

Потім можна здійснити виклик API на свій сайт, встановивши заголовки із поверненим маркером та секретом маркера.

Ви можете пропустити це декількома способами через заголовок авторизації, у параметрах GET або POST (якщо закодовано як application / x-www-form-urlencoded). Майте на увазі, що ОБОВ'ЯЗКОВО пройти підпис, часову позначку та без позначення. Я не усвідомлював, як довго мені знадобиться ця відповідь, тож я завтра оновлю це прикладом того, як зробити це з вашим кодом.

Я настійно рекомендую встановити журнал Rest API, щоб ви могли переглядати журнал викликів API, і бачити, що було надіслано, повернуто тощо. Це допоможе надзвичайно налагодити.

https://github.com/petenelson/wp-rest-api-log


Я знаю, є багато навчальних посібників з Postman або подібними інструментами, але я не можу знайти жодних підручників, які б виконали весь процес з функціоналами CURL, я маю на увазі чистий код PHP. Це те, що я хочу.
MinhTri

@ Dan9 TBH це насправді неможливо ... принаймні, не з OAuth1, головним чином через те, що вам потрібно АВТОРИЗАЦІЮвати додаток під обліковим записом користувача. Всі інші кроки легко виконати з CURL, проблема полягає у використанні CURL для входу в систему як користувача WordPress (це означає, що вам потрібно зберігати облікові дані у вашому PHP-файлі, що НЕ є гарною ідеєю), а також авторизувати програму, яку ви можна змінити базу коду OAuth1, але якщо чесно, якщо ви хочете використовувати CURL, щоб зробити ВСЕ ... ви думаєте про це неправильно, і вам слід придумати інше рішення чи метод.
sMyles

@ Dan9 з тим, що ви намагаєтеся зробити, ви повинні використовувати сервер OAuth2 замість OAuth1, головним чином через те, що OAuth2 має нові функції, включаючи тип надання грантів Client Credential, що дозволяє уникнути необхідності пройти всі ці кроки bshaffer.github.io / oauth2-server-php-docs / grant-types /…
sMyles

@ Dan9, якщо ви на 100% готові отримати допомогу в цьому через OAuth1, використовуючи CURL, я думаю, що це можливо за допомогою декількох злому коду, але, як я вже згадував, це означає, що ви повинні зберегти USERNAME та PASSWORD користувача у файл PHP Якщо ви добре з цим, дайте мені знати і погано написати підручник, щоб зробити це за допомогою CURL, не хочете витрачати час на написання підручника, якщо ви збираєтесь піти з OAuth2 або більше цього вам не потрібно
sMyles

@ Dan9 добре ... це просто так ... якщо ви збираєтеся використовувати OAuth1, вам потрібно пов’язати обліковий запис користувача WordPress. В основному ви думаєте про маркер доступу, як ключ API ... "API ключ" повинен бути пов'язаний з обліковим записом користувача ... тепер, чи ви використовуєте якийсь стандартний обліковий запис, який ви налаштуєте, залежить від вас, але незалежно від використання OAuth1 це ПОВИНЕН бути пов'язаний з обліковим записом користувача, отже, тривалий процес отримання маркера доступу.
sMyles

2

Додавши це як ще одну відповідь, щоб допомогти вам зрозуміти, як це зробити. В основному, як згадувалося в моїх коментарях, якщо ви збираєтесь використовувати OAuth1, ОБОВ'ЯЗКОВО пов’язати його з обліковим записом користувача, не обходячи це.

Спочатку вам потрібно скористатися CURL для входу на сайт із паролем імені користувача для WordPress, зберегти файл cookie, щоб ви могли використовувати його у своєму виклику CURL до OAuth (обов'язково оновіть свій дзвінок CURL, щоб включити файл cookie):

/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php

Потім зателефонуйте до OAuth за допомогою CURL з ідентифікатором клієнта та клієнтською таємницею, щоб отримати тимчасовий маркер та секрет Oauth (Запит жетону)

Щоб здійснити цей виклик (і виклик отримати маркер доступу), вам потрібно правильно настроїти свій дзвінок CURL. Дивіться кінець цієї відповіді для коду та посилань.

Отримавши тимчасовий маркер та секрет Oauth (Запит жетону), зателефонуйте 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, щоб завершити "авторизацію" на POSTing http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce - Це значення без значення для форми, яку потрібно подати, ЦЕ ОБОВ'ЯЗКОВО витягнути з введення HTML та надіслати разом із вашим POST

    consumer - Це прихований вхід у HTML (це посилання на ідентифікатор допису, тому ви повинні витягнути його з введення HTML

    oauth_token - Це прихований вхід у HTML (але ви також повинні вже мати такий)

    wp-submit - Для цього потрібно встановити значення authorize

Ось приклад, створений HTML для сторінки аутентифікації:

<form name="oauth1_authorize_form" id="oauth1_authorize_form" action="http://website.com/wp-login.php?action=oauth1_authorize" method="post">

    <h2 class="login-title">Connect My Auth</h2>

    <div class="login-info">
        <p>Howdy <strong>admin</strong>,<br/> "My OAuth Demo" would like to connect to Example Site.</p>

    </div>

    <input type="hidden" name="consumer" value="5428" /><input type="hidden" name="oauth_token" value="i1scugFXyPENniCP4kABKtGb" /><input type="hidden" id="_wpnonce" name="_wpnonce" value="ca9b267b4f" /><input type="hidden" name="_wp_http_referer" value="/wp-login.php?action=oauth1_authorize&amp;oauth_consumer_key=TUPFNj1ZTd8u&amp;oauth_token=i1scugFXyPENniCP4kABKtGb&amp;oauth_token_secret=gzqW47pHG0tilFm9WT7lUgLoqN2YqS6tFFjUEiQoMgcmG2ic" />   <p class="submit">
        <button type="submit" name="wp-submit" value="authorize" class="button button-primary button-large">Authorize</button>
        <button type="submit" name="wp-submit" value="cancel" class="button button-large">Cancel</button>
    </p>

</form>

Після того, як ви зробите POST з усіма цими значеннями / даними, це HTML, який буде повернутий з кодом авторизації (тому вам потрібно витягнути значення зсередини <code>блоку:

<div id="login">
    <h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Example Site</a></h1>
    <p>Your verification token is <code>yGOYFpyawe8iZmmcizqVIw3f</code></p> <p id="backtoblog"><a href="http://website.com/">&larr; Back to Example Site</a></p>
</div>

Після того, як у вас з'явиться маркер підтвердження, ви зможете зателефонувати за /oauth1/accessдопомогою маркера підтвердження, маркера oauth та секрета лексеми oauth. Маркер підтвердження повинен бути введений у дані POST якoauth_verifier

Це поверне ваш новий та постійний маркер доступу та VOILA!

Приклад CURL-коду

Нижче наведено приклад коду для здійснення CURL-виклику, найважливішою частиною є те, як oauth_signatureформується:

https://oauth1.wp-api.org/docs/basics/Signing.html

function buildBaseString($baseURI, $method, $params){
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth){
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";

    $r .= implode(', ', $values);
    return $r;
}

// Add request, authorize, etc to end of URL based on what call you're making
$url = "http://domain.com/oauth/";

$consumer_key = "CLIENT ID HERE";
$consumer_secret = "CLIENT SECRET HERE";

$oauth = array( 'oauth_consumer_key' => $consumer_key,
                'oauth_nonce' => time(),
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_callback' => 'oob',
                'oauth_timestamp' => time(),
                'oauth_version' => '1.0');

$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;


$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$return_data = json_decode($json);

print_r($return_data);

Цей сайт розповідає, як саме кодувати підпис 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.
MinhTri

@ Dan9 так, це правильно, адміністратори повинні створити додаток, інакше це може бути величезною проблемою безпеки, яка дозволить програмам створювати анонімні користувачі. Ось деякі сайти щодо підпису wordpress.stackexchange.com/questions/185511/… github.com/WP-API/OAuth1/isissue/34 github.com/WP-API/OAuth1/isissue/27
sMyles

0

Оновлення: з того, що я прочитав, вам потрібно зробити кілька завитків, щоб отримати access_token, який ви потім використовуєте для виконання запиту

  • Придбання тимчасових облікових даних: клієнт отримує набір тимчасових облікових даних від сервера.
  • Авторизація: Користувач "авторизує" маркер запиту для доступу до свого облікового запису.
  • Token Exchange: Клієнт обмінює короткочасні тимчасові облікові дані на довгоживучий маркер.

oauth1 потік сервера


0

Я знаю, що я замислююся про це трохи пізно, але чи можете ви використовувати wp_remote_get та _post?

Я перетягую та публікую вміст із моєю установкою Wordpress, використовуючи їх:

Це загальна ідея кодексу Wordpress:

$response = wp_remote_post( $url, array(
    'body'    => $data,
    'httpversion' => '1.0',
    'sslverify' => false,
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
    ),
) );

Ось більш конкретний приклад:

$url='http://WWW.EXAMPLE HERE.';
$response = wp_remote_post( $url, array(
    'method' => 'POST',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0', //needed to get a response
    'blocking' => true,
    'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MY TOKENID' . ':' . '' )),
    'body' => $body // in array
    'cookies' => array()
    )
);

if ( is_wp_error( $response ) ) {
   $error_message = $response->get_error_message();
   echo "Something went wrong: $error_message";
} else {
 //  echo 'Response:<pre>';
 //  print_r( $response );
 //    echo '</pre>'; 
$responseBody = json_decode($response['body'],true);
echo $responseBody['message'];

    }
    }
}

Трюк - кодування імені користувача та pw. Зараз часто час залежно від імені користувача API і pw буде порожнім або буде вашим жетоном.

так, наприклад, у моєму конкретному прикладі вище, заголовки були

'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MYTOKENID' . ':' . '' ))

і я залишив pw порожнім. Це залежить від системи API, яку ви використовуєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.