Saya sedang mengerjakan aplikasi ajax yang akan disematkan di halaman wordpress. Aplikasi ajax bertukar data dengan servlets berjalan pada kucing jantan. Sekarang servlets membutuhkan cara untuk menentukan apakah permintaan berasal dari pengguna yang masuk ke wordpress. Dan jika pengguna login, servlet juga harus dapat menentukan id pengguna agar dapat melakukan query database. Jika pengguna tidak mencatatnya, permintaan akan ditolak.
Jadi dengan kata lain, saya perlu membiarkan servlet melakukan permintaan hanya jika pengguna yang menyebabkan permintaan tersebut masuk ke wordpress (versi 3.3.x). Baik servlet (tomcat) dan wordpress (apache2) dijalankan pada mesin fisik yang sama dan berbagi database yang sama.
Secara teori ini dapat dengan mudah diselesaikan dengan melakukan hal berikut:
- Selama logon wordpress, beberapa token pengguna disimpan dalam variabel javascript.
- Aplikasi ajax meneruskan token pengguna ke servlet pada setiap panggilan.
- Servlet menggunakan token untuk query wordpress jika valid (yaitu jika pengguna login) dan melakukan atau menolak permintaan.
Pertanyaannya adalah bagaimana ini bisa diterapkan di sisi wordpress?
Karena, yang membuat teorinya sangat rumit adalah kenyataan bahwa saya belum melakukan pemrograman php.
Pertama saya berpikir untuk mengirimkan cookie wordpress_logged_in (auth) ke servlet dan membiarkan servlet meminta wordpress jika cookie auth masih valid. Tapi seperti yang terlihat, ini tidak dapat dilakukan, karena wp_validate_auth_cookie () selalu gagal, bahkan jika cookie-data pengguna yang masuk telah lewat. Solusi lain bisa dengan mengembangkan plugin yang menyimpan sessionid dan userid dalam sebuah tabel, yang dapat dengan mudah ditanyakan oleh servlets. Atau mungkin ada solusi lain ...
sumber
Jawaban:
WordPress sudah memiliki API bawaan melalui server XMLRPC. Artinya, Anda dapat membuat permintaan XMLRPC dari aplikasi java Anda dan memverifikasi nama pengguna / kata sandi. Sayangnya, tidak ada cara untuk hanya membuktikan keasliannya.
Yang mengatakan, sangat mudah untuk roll Anda sendiri. Cukup sambungkan ke
xmlrpc_methods
, filter, dan tambahkan milik Anda. Kunci array yang Anda tambahkan dengan menjadi metode xmlrpc yang Anda panggil dari aplikasi Anda, dan nilainya akan menjadi fungsi yang dipanggil oleh server WordPress XMLRPC.Dan fungsi callback
wpse39662_check_login
,, akan mendapatkan satu argumen yang diteruskan ke sana, array hal yang dikirim ke server XMLRPC.Ini semua sebagai plugin . Dengan yang terinstal dan XMLRPC diaktifkan di situs WP Anda, Anda harus dapat membuat permintaan dengan beberapa klien XMLRPC (saya yakin Java memilikinya).
Berikut kode yang saya gunakan untuk menguji di atas (klien Python XMLRPC).
sumber
Wordpress (saat ini) memeriksa apakah pengguna masih masuk dengan memeriksa salah satu cookie yang diberikan saat masuk. Itu membangun konten cookie ini dengan melakukan hashing. Detailnya ada di fungsi "wp_generate_auth_cookie" di /wp-includes/pluggable.php:
Anda dapat membuat kembali algoritma ini (menggunakan ini dan fungsi auth_cookie lainnya) dalam kode Java Anda untuk melakukan pemeriksaan yang sama. JS dapat digunakan untuk memastikan cookie dikirimkan ke servlet Anda.
Kalau tidak, XMLRPC mungkin ide yang bagus. Anda dapat menulis metode baru (seperti yang dijelaskan dalam solusi lain di sini) untuk memvalidasi cookie auth (alih-alih memvalidasi nama pengguna dan kata sandi seperti biasanya dilakukan).
sumber
Dapatkan plugin Exec-PHP , lalu buat halaman WordPress (bukan pos) dengan permalink yang bagus (
http://mysite/user_id/
) dan kode padaget_current_user_id()
referensi API :Anda kemudian dapat mengekstrak cookie yang dikirim klien kepada Anda dan memasukkannya ke dalam
GET
permintaanhttp://127.0.0.1/user_id/
. Kemudian Anda akan tahu apakah pengguna itu login dan apa ID pengguna mereka.sumber
Anda dapat melakukan sesuatu seperti ini di halaman non-wp:
sumber
Ini adalah plugin WordPress satu-file yang berfungsi:
Pada dasarnya memperlihatkan metode XML-RPC baru yang dengannya Anda dapat meminta WordPress untuk memvalidasi
wordpress_logged_in_...
cookie.Anda kemudian perlu menulis beberapa kode untuk menanyakan metode ini dan memberikannya nilai
wordpress_logged_in_...
cookie.Metode ini akan mengembalikan
false
(jika cookie tidak divalidasi) atau ID pengguna jika validasi berhasil.sumber