Cara menggunakan file_get_contents() dengan cookie pengguna Wordpress

Saya perlu mengirim file_get_contents() ke titik akhir API dengan cookie klien yang disetel oleh Wordpress untuk menunjukkan bahwa pengguna masuk ke situs wordpress. Saya tahu saya perlu menggunakan stream_context_create() kira-kira sebagai berikut:

$cookies = ??? //THIS IS THE QUESTION (see answer below)!

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$cookies}\r\n"
  )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://example.dev/api/autho/', false, $context);

Seperti yang Anda lihat dari komentar di baris pertama, saya bingung bagaimana cara mengirim permintaan ini agar cookie yang benar terkirim. Saya tahu cookie yang benar dikirimkan karena saya dapat mencetak $_COOKIES dan melihatnya di sana. Tetapi jika saya mencoba memasukkan array yang sama ke dalam header, itu tidak berhasil.

Terima kasih sebelumnya!

ps: Saya pernah membaca bahwa saya harus menggunakan cURL untuk ini, tapi saya tidak yakin mengapa dan saya tidak tahu bagaimana menggunakannya... tapi saya terbuka dengan ide itu.

PEMBARUAN: Saya membuat ini berfungsi. Ini pada dasarnya adalah hal yang sama yang saya lakukan, dengan cookie penting lainnya. Lihat jawaban saya di bawah ini.


person emersonthis    schedule 31.07.2012    source sumber
comment
Apakah Anda 100% yakin tidak ada cara sisi klien (Ajax) untuk melakukan ini? Ini akan menjadi jauh lebih bersih   -  person Pekka    schedule 31.07.2012
comment
kemungkinan duplikat PHP - Kirim cookie dengan file_get_contents   -  person nickb    schedule 31.07.2012
comment
Sobat, tautan pertama setelah googling php curl cookiescoderscult .com/php/php-curl/2008/05/20/php-curl-cookies-example dan dokumentasi php lengkap untuk curl_setopt khususnya CURLOPT_COOKIE   -  person Vyktor    schedule 31.07.2012
comment
@Lusitanian ps: Saya pernah membaca bahwa saya harus menggunakan cURL untuk ini, tapi saya tidak yakin mengapa dan saya tidak tahu cara menggunakannya... tapi saya terbuka dengan ide itu. ‹ dia harus menggunakannya :)   -  person Vyktor    schedule 31.07.2012
comment
@Vyktor telapak tangan salahku (:   -  person Lusitanian    schedule 31.07.2012
comment
@Lusitanian: Saya akan memeriksa sumber daya curl yang Anda rekomendasikan, tetapi ini bukan pilihan pertama saya jika ini dapat dilakukan dengan file_get_contents() @Pekk: ADA cara sisi klien untuk melakukannya yang berfungsi dengan baik, tetapi saya tidak punya pilihan itu. Ada masalah keamanan.   -  person emersonthis    schedule 01.08.2012


Jawaban (4)


Cookie harus dalam format berikut: Cookie: cookieone=value; cookietwo=value, yaitu dipisahkan dengan titik koma dan spasi tanpa titik koma di belakangnya. Ulangi susunan cookie Anda, keluarkan format itu, dan kirimkan.

person Lusitanian    schedule 31.07.2012
comment
Ini adalah hal pertama yang saya coba dan tidak berhasil. Saya tidak mendapat imbalan apa pun dari file_get_contents. Saya tidak yakin mengapa. - person emersonthis; 01.08.2012

Ternyata saya melakukannya dengan benar, tetapi saya tidak tahu bahwa WP memerlukan cookie kedua yang dikirim agar permintaan dapat berfungsi dengan baik.

Inilah kode yang berfungsi untuk saya:

$cookies = $_COOKIE;
$name;
$value;
foreach ($_COOKIE as $key => $cookie ) {
    if ( strpos( $key, 'wordpress_logged_in') !== FALSE ) {
        $name = $key;
        $value = $cookie;
    } 
}

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$key}={$cookie}; wordpress_test_cookie=WP Cookie check \r\n"
  )
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents('http://mydomain.dev/api/autho/', false, $context);

var_dump($file);

Ini pada dasarnya sama seperti yang Anda lihat di pertanyaan saya, tetapi dengan tambahan penting: wordpress_test_cookie=WP Cookie check. Saya belum melihatnya didokumentasikan di mana pun, tetapi WP memerlukan cookie ini serta cookie wordpress_logged_in yang sebenarnya agar panggilan terjadi sebagai pengguna yang masuk.

person emersonthis    schedule 01.08.2012

Oke, seperti yang Anda sebutkan, Anda harus menggunakan cURL (sebagian itu pendapat pribadi saya, saya memiliki beberapa pengalaman buruk dengan konfigurasi server yang melarang pembungkus file URL).

Kutipan dari manual:

URL dapat digunakan sebagai nama file dengan fungsi ini jika pembungkus fopen telah diaktifkan.

Jadi mungkin saja kode tersebut tidak berfungsi. Di sisi lain cURL dirancang untuk mengambil konten jarak jauh dan memberikan banyak kendali atas apa yang terjadi, cara mengambil data, dan sebagainya.

Saat Anda melihat curl_setopt Anda dapat melihat berapa banyak dan seberapa detail hal yang Anda dapat diatur (tetapi tidak harus, itu hanya opsional saat Anda membutuhkannya).

Inilah tautan pertama setelah googling php curl set cookies, itu tempat yang bagus bagi Anda untuk memulai... Contoh-contoh dasar benar-benar sepele.

person Vyktor    schedule 31.07.2012
comment
Saya mencoba menggunakan curl, seperti yang ditunjukkan di tautan itu, tetapi tidak berhasil. Info yang dikembalikan menunjukkan tidak ada pengguna yang masuk. Jika saya memasukkan titik akhir API ke browser, saya melihat user_id Wordpress, dll. Jadi cookie disetel dengan benar. - person emersonthis; 01.08.2012
comment
Tahukah Anda jika/di mana saya harus melihat file sementara itu setelah saya menguji kode itu? Saya menguji pada MAMP PRO dan tidak melihatnya di Aplikasi/MAMP/tmp/, dan saya bertanya-tanya apakah ada masalah izin atau apa, tapi saya tidak tahu apa yang harus saya harapkan. - person emersonthis; 01.08.2012
comment
Memperbarui. Saya menemukan tempat MAMP menyimpan file (/private/tmp/COOKIExyz). File tidak menunjukkan status login pengguna: mydomain.dev FALSE / FALSE 0 PHPSESSID 8dacd1af06a4cc75936fef743b52a8ef - person emersonthis; 01.08.2012

$cookies = $_COOKIE;
foreach ($_COOKIE as $key => $cookie ) {
    if ( strpos( $key, 'wordpress_logged_in') !== FALSE ) {
        $name = $key;
        $value = $cookie;
        break;
    } 
}

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$key}={$cookie}; wordpress_test_cookie=WP Cookie check\r\n"
  )
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents('http://mydomain.dev/api/autho/', false, $context);

var_dump($file);

Saya tidak punya alasan untuk berkomentar, jadi saya membaca kode dari emersonthis. Agar ini berfungsi di bawah konfigurasi saya (php 7.0.3, wordpress 4.4.2) saya HARUS menghapus spasi terakhir setelah string "WP Cookie check".

person Fredrik_Borgstrom    schedule 08.03.2016