Bagaimana cara menggunakan otentikasi OAuth dengan REST API via perintah CURL?

18

Saya mencoba menggunakan WordPress Rest Api dengan otentikasi untuk mendapatkan lebih banyak data dari API. Saya telah menginstal plugin Oauth, rest-api plugin, dan mendapatkan kredensial API dari WP-CLI.

Saya telah menemukan cara mengakses data tanpa otorisasi. Ini bekerja:

// 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>

Tapi saya tidak tahu cara mengautentikasi dengan kredensial. Ini usahaku. Saya tidak yakin apakah "kunci" dan "rahasia" benar.

// 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>

Outputnya adalah

Array
(
    [code] => rest_cannot_read
    [message] => Sorry, you cannot view revisions of this post.
    [data] => Array
        (
            [status] => 401
        )
)

Bagaimana saya bisa membuatnya bekerja? Terima kasih.

JediTricks007
sumber
2
Segalanya tidak begitu mudah. Saya sudah mencoba menulis jawaban tetapi cukup panjang. Anda bisa mulai dengan membaca dokumen, khususnya Alur Otorisasi . Posting ini juga memiliki tutorial yang bagus .
cybmeta

Jawaban:

10

Mari kita selangkah demi selangkah di sini. Sepertinya Anda mencoba menggunakan OAuth hanya untuk otentikasi, tetapi sebelum Anda dapat melakukannya, Anda perlu mendapatkan Token Akses yang akan digunakan untuk mengautentikasi ketika Anda melakukan panggilan API.

Karena ini menggunakan OAuth versi 1, untuk mendapatkan Token Akses Anda harus melakukan yang berikut:

  1. Pertama, atur aplikasi, lakukan panggilan ke situs untuk mendapatkan Token Permintaan (kredensial temp) menggunakan ID Klien dan Rahasia untuk aplikasi
  2. Kedua, melakukan panggilan ke situs untuk mengotorisasi aplikasi dengan Token Permintaan dari langkah pertama (menghadap pengguna, lihat di bawah).
  3. Ketiga, setelah otorisasi selesai, Anda kemudian melakukan panggilan ke situs untuk mendapatkan Token Akses (sekarang aplikasi telah diotorisasi)

Saya sarankan menggunakan tukang pos untuk beberapa langkah pertama, karena mereka hanya perlu diselesaikan sekali. Postman juga akan menangani pembuatan timestamp, noncedan oauth signature, jadi jika Anda tidak menggunakan perpustakaan OAuth, maka Anda harus benar-benar menggunakan Postman. Setelah Anda memiliki Token Akses, Anda dapat melakukan panggilan melalui CURL tanpa pustaka.

https://www.getpostman.com/

Langkah Pertama (aplikasi pengaturan)

Instal plugin WP OAuth 1, aktifkan, lalu buka menu di bawah Users> Applications . Tambahkan aplikasi baru, isi nama dan deskripsi. Untuk panggilan balik baik URL untuk mengarahkan pengguna ke (setelah otorisasi), atau oopuntuk aliran Out-of-Band yang akan mengarahkan ke halaman internal yang menampilkan token verifier (alih-alih mengarahkan ulang).

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

Untuk melanjutkan ke langkah kedua, panggilan harus dilakukan ke situs Anda, menggunakan ID Klien dan Rahasia Klien dari aplikasi yang dibuat, untuk mendapatkan kredensial sementara (Permintaan Token).

Buka tukang pos, buat panggilan baru untuk http://website.com/oauth1/request, klik pada tab Otorisasi, pilih OAuth 1.0 dari dropdown, masukkan di Kunci Klien, Rahasia Klien, atur metode tanda tangan ke HMAC-SHA1, aktifkan tambahkan params ke header, encode tanda tangan oauth , lalu klik Perbarui Permintaan

Permintaan tukang pos OAuth1

Tukang pos akan secara otomatis membuat tanda tangan, nonce, dan cap waktu untuk Anda, dan menambahkannya ke header (Anda dapat melihat di bawah tab Header).

Klik Kirim dan Anda akan mendapatkan respons yang mencakup oauth_tokendan oauth_token_secret: Tukang Pos OAuth1 Minta Tanggapan

Nilai-nilai ini akan digunakan pada langkah selanjutnya untuk mengotorisasi aplikasi di bawah akun pengguna WordPress Anda.

Langkah Kedua (otorisasi aplikasi)

Langkah otorisasi hanya perlu diselesaikan satu kali, langkah ini menghadap ke pengguna, dan yang sudah dikenal semua orang. Langkah ini diperlukan karena Anda menggunakan OAuth1, dan aplikasi harus dikaitkan dengan akun pengguna WordPress. Pikirkan ketika sebuah situs memungkinkan Anda untuk masuk dengan Facebook ... mereka mengarahkan Anda ke Facebook tempat Anda masuk dan klik "Otorisasi" ... ini perlu dilakukan, hanya melalui situs WordPress Anda.

Saya sarankan menggunakan Browser Web Anda untuk langkah ini, karena Anda dapat dengan mudah mengatur variabel dalam URL, dan ini menyediakan halaman "Otorisasi" untuk mengotorisasi aplikasi.

Buka browser web Anda dan ketik URL ke situs Anda, seperti ini: http://website.com/oauth1/authorize

Sekarang tambahkan ke URL ini, oauth_consumer_key(ID Klien), oauth_tokendan oauth_token_secret(dari langkah sebelumnya). Dalam contoh saya ini adalah URL lengkap:

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

Aplikasi OAuth1 Otorisasi

Setelah mengklik Otorisasi, Anda akan mendapatkan layar lain dengan token verifikasi. Dalam contoh saya ini adalah token verifikasi yang dikembalikanE0JnxjjYxc32fMr2AF0uWsZm

Langkah Ketiga (dapatkan token akses)

Sekarang kami telah mengotorisasi aplikasi, kami perlu melakukan satu panggilan terakhir untuk mendapatkan Token Otorisasi yang akan digunakan untuk melakukan semua panggilan API Anda. Sama seperti langkah pertama saya akan menggunakan Postman (karena tanda tangan diharuskan menjadi HMAC-SHA1), dan itu membuat 100x lebih mudah untuk menyelesaikan langkah-langkah ini.

Buka tukang pos lagi, dan ubah URL menjadi http://website.com/oauth1/access

Pastikan untuk menambahkan Token, dan Token Secret (nilai dari langkah pertama), lalu klik pada Params untuk menampilkan kotak di bawah URL. Di sebelah kiri ketik oauth_verifier dan di sebelah kanan, masukkan kode dari langkah kedua, Token Verifikasi

Langkah Akses OAuth1 Tukang Pos

Pastikan untuk mengklik Perbarui Permintaan, lalu klik Kirim, dan Anda harus mendapatkan respons kembali dengan oauth_tokendan oauth_token_secret... inilah yang Anda perlukan untuk melakukan panggilan API dengan! Buang yang asli dari langkah 1, simpan yang ini di kode Anda atau di tempat lain yang aman.

Tukang Pos OAuth1 Akses Respons

Anda kemudian dapat melakukan panggilan API ke situs Anda, mengatur tajuk dengan token yang dikembalikan, dan token rahasia.

Anda dapat melewati beberapa cara ini, melalui tajuk Otorisasi, dalam parameter GET, atau POST (jika disandikan sebagai aplikasi / x-www-form-urlencoded). Ingatlah bahwa Anda HARUS melewati tanda tangan, cap waktu, dan nonce. Saya tidak menyadari berapa lama balasan ini akan membawa saya, jadi saya akan memperbarui ini besok dengan contoh melakukan hal itu dengan kode Anda.

Saya sangat menyarankan untuk menginstal log Rest API sehingga Anda dapat melihat log panggilan API, dan melihat apa yang dikirim, dikembalikan, dll. Ini akan sangat membantu dengan debugging.

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

sMyles
sumber
Saya tahu, ada banyak tutorial dengan tukang pos atau alat serupa tetapi saya tidak dapat menemukan tutorial yang dapat melakukan seluruh proses dengan fungsi CURL, maksud saya kode PHP murni. Itu yang saya mau.
MinhTri
@ Dan9 TBH itu tidak benar-benar mungkin ... setidaknya tidak dengan OAuth1, terutama karena Anda harus MENGotorisasi aplikasi di bawah akun pengguna. Semua langkah lain mudah dilakukan dengan CURL, masalahnya menggunakan CURL untuk login sebagai pengguna WordPress (yang berarti Anda perlu menyimpan kredensial dalam file PHP Anda yang BUKAN ide yang baik), DAN untuk mengotorisasi aplikasi, yang Anda dapat memodifikasi basis kode OAuth1, tetapi jujur ​​jika Anda ingin menggunakan CURL untuk melakukan SEMUA ... Anda memikirkan hal ini dengan cara yang salah, dan harus datang dengan solusi atau metode lain.
sMyles
@ Dan9 dengan apa yang Anda coba lakukan, Anda harus menggunakan server OAuth2 alih-alih OAuth1, terutama karena fakta bahwa OAuth2 memiliki fitur baru termasuk jenis hibah Kredensial Klien, yang menghindari harus melalui semua langkah ini bshaffer.github.io / oauth2-server-php-docs / grant-types /…
sMyles
@ Dan9 jika Anda 100% siap mendapatkan bantuan untuk melakukan ini melalui OAuth1, menggunakan CURL, saya pikir itu mungkin dengan beberapa peretasan kode, tetapi seperti yang saya sebutkan, ini berarti Anda harus menyimpan USERNAME dan PASSWORD dari pengguna ke file PHP. Jika Anda baik-baik saja dengan itu, beri tahu saya dan sakitkan tutorial untuk melakukannya menggunakan CURL, tidak ingin menghabiskan waktu menulis tutorial jika Anda akan pergi dengan OAuth2 atau tidak membutuhkan ini lagi
sMyles
@ Dan9 yah ... itu saja ... jika Anda akan menggunakan OAuth1, Anda harus mengaitkan Akun Pengguna WordPress. Pada dasarnya pikirkan Token Akses seperti kunci API ... "Kunci API" harus dikaitkan dengan akun pengguna ... sekarang apakah Anda menggunakan beberapa akun standar yang Anda siapkan terserah Anda .. tetapi terlepas dari kapan menggunakan OAuth1 itu HARUS dikaitkan dengan akun pengguna, karenanya proses yang panjang untuk mendapatkan token akses.
sMyles
2

Menambahkan ini sebagai jawaban lain untuk membantu Anda mengetahui cara melakukan ini. Pada dasarnya seperti yang disebutkan dalam komentar saya jika Anda akan menggunakan OAuth1 Anda HARUS mengaitkannya dengan akun pengguna, tidak ada jalan lain.

Pertama, Anda perlu menggunakan CURL untuk masuk ke situs dengan kata sandi nama pengguna untuk WordPress, simpan cookie sehingga Anda dapat menggunakannya dalam panggilan CURL Anda ke OAuth (pastikan untuk memperbarui panggilan CURL Anda untuk memasukkan cookie):

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

Kemudian lakukan panggilan ke OAuth menggunakan CURL dengan ID Klien dan Rahasia Klien, untuk mendapatkan token dan rahasia sementara (Permintaan Token)

Untuk melakukan panggilan ini (dan panggilan untuk mendapatkan token akses), Anda perlu mengatur panggilan CURL Anda dengan benar. Lihat akhir jawaban ini untuk kode dan referensi.

Setelah Anda memperoleh token dan rahasia sementara (Permintaan Token), lakukan panggilan CURL POST ke URL situs Anda ini:

http://website.com/oauth1/authorize

Anda kemudian perlu menarik semua nilai dari HTML yang dikembalikan untuk halaman otorisasi, dan kemudian mengirimkan POST Anda sendiri ke URL tindakan bentuk.

/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl

Khususnya ini harus dimasukkan dalam data POST Anda untuk menyelesaikan "otorisasi" POSTing http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce - Ini adalah nilai nonce untuk formulir yang akan dikirim, ini HARUS ditarik dari input HTML dan dikirimkan dengan POST Anda

    consumer - Ini adalah input tersembunyi dalam HTML (ini adalah referensi ke Post ID sehingga Anda harus menariknya dari input HTML

    oauth_token - Ini adalah input tersembunyi dalam HTML (tetapi Anda juga harus sudah memiliki ini)

    wp-submit - Ini perlu diatur ke nilai authorize

Berikut ini contoh HTML yang dihasilkan untuk halaman otentikasi:

<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>

Setelah Anda membuat POST dengan semua nilai / data tersebut, ini adalah HTML yang akan dikembalikan dengan kode otorisasi (jadi Anda perlu menarik nilainya dari dalam <code>blok:

<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>

Setelah Anda memiliki token verifikasi, Anda kemudian dapat melakukan panggilan untuk /oauth1/accessmenggunakan token verifikasi, oauth token, dan rahasia token oauth. Token verifikasi harus dimasukkan ke dalam data POST sebagaioauth_verifier

Itu akan mengembalikan Token Akses baru dan permanen Anda, dan VOILA!

Contoh Kode CURL

Di bawah ini adalah contoh kode untuk melakukan panggilan CURL, bagian terpenting adalah bagaimana oauth_signaturedihasilkannya:

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

Situs ini memberi tahu persis bagaimana menyandikan tanda tangan OAuth, dan cara mengirim menggunakan CURL (saya sarankan membaca seluruh halaman): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- data/

Lebih banyak sumber daya tentang menghasilkan tanda tangan OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1

Sumber Daya Lain: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/

sMyles
sumber
Bagaimana saya bisa mendapatkan ID Klien dan rahasia Klien dan mengaitkannya dengan pengguna yang valid? Saat ini, hanya admin yang dapat membuat aplikasi baru dan itu terjadi hanya melalui dasbor admin. Btw, saya telah mencoba untuk menghasilkan oauth_signatureseperti yang Anda katakan tetapi, entah bagaimana, jawabannya selalu json_oauth1_signature_mismatch.
MinhTri
@ Dan9 ya itu benar, admin harus membuat aplikasi, kalau tidak itu akan menjadi masalah keamanan besar yang memungkinkan aplikasi dibuat oleh pengguna anonim. Berikut ini beberapa situs mengenai tanda tangan wordpress.stackexchange.com/questions/185511/... github.com/WP-API/OAuth1/issues/34 github.com/WP-API/OAuth1/issues/27
sMyles
0

Pembaruan: Dari apa yang saya baca, Anda perlu melakukan beberapa ikal untuk mendapatkan access_token, yang kemudian Anda gunakan untuk melakukan kueri

  • Akuisisi Kredensial Sementara: Klien mendapatkan seperangkat kredensial sementara dari server.
  • Otorisasi: Pengguna "mengesahkan" token permintaan untuk mengakses akun mereka.
  • Token Exchange: Klien menukar kredensial sementara berumur pendek dengan token yang berumur panjang.

oauth1 aliran server

juz
sumber
0

Saya tahu saya agak terlambat dalam hal ini, tetapi bisakah Anda menggunakan wp_remote_get dan _post?

Saya menarik dan memposting konten dengan instalasi wordpress saya menggunakannya:

Ini adalah ide umum dari kodeks wordpress:

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

Ini adalah contoh yang lebih spesifik:

$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'];

    }
    }
}

Caranya adalah menyandikan nama pengguna dan pw. Sekarang sering kali tergantung pada nama pengguna API dan pw akan kosong atau akan menjadi token Anda.

jadi misalnya dalam contoh khusus saya di atas, tajuknya

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

dan saya meninggalkan pw kosong. Itu terserah sistem API yang Anda gunakan.

rudtek
sumber