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.
authentication
rest-api
curl
JediTricks007
sumber
sumber
Jawaban:
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:
Saya sarankan menggunakan tukang pos untuk beberapa langkah pertama, karena mereka hanya perlu diselesaikan sekali. Postman juga akan menangani pembuatan
timestamp
,nonce
danoauth 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
oop
untuk 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 keHMAC-SHA1
, aktifkan tambahkan params ke header, encode tanda tangan oauth , lalu klik Perbarui PermintaanTukang 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_token
danoauth_token_secret
: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_token
danoauth_token_secret
(dari langkah sebelumnya). Dalam contoh saya ini adalah URL lengkap:Setelah mengklik Otorisasi, Anda akan mendapatkan layar lain dengan token verifikasi. Dalam contoh saya ini adalah token verifikasi yang dikembalikan
E0JnxjjYxc32fMr2AF0uWsZm
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
Pastikan untuk mengklik Perbarui Permintaan, lalu klik Kirim, dan Anda harus mendapatkan respons kembali dengan
oauth_token
danoauth_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.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
sumber
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 Andaconsumer
- Ini adalah input tersembunyi dalam HTML (ini adalah referensi ke Post ID sehingga Anda harus menariknya dari input HTMLoauth_token
- Ini adalah input tersembunyi dalam HTML (tetapi Anda juga harus sudah memiliki ini)wp-submit
- Ini perlu diatur ke nilaiauthorize
Berikut ini contoh HTML yang dihasilkan untuk halaman otentikasi:
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:Setelah Anda memiliki token verifikasi, Anda kemudian dapat melakukan panggilan untuk
/oauth1/access
menggunakan 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_signature
dihasilkannya:https://oauth1.wp-api.org/docs/basics/Signing.html
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/
sumber
oauth_signature
seperti yang Anda katakan tetapi, entah bagaimana, jawabannya selalujson_oauth1_signature_mismatch
.Pembaruan: Dari apa yang saya baca, Anda perlu melakukan beberapa ikal untuk mendapatkan access_token, yang kemudian Anda gunakan untuk melakukan kueri
oauth1 aliran server
sumber
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:
Ini adalah contoh yang lebih spesifik:
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
dan saya meninggalkan pw kosong. Itu terserah sistem API yang Anda gunakan.
sumber