Buat API untuk sistem masuk tunggal dengan situs pihak ketiga

13

Situs saya perlu diintegrasikan dengan perangkat lunak pihak ke-3, yang akan hidup pada sub-domain sendiri, yang dihosting oleh perusahaan perangkat lunak. Saya perlu memberikan titik akhir kepada pengembang pihak ke-3 yang dapat mereka gunakan untuk melakukan panggilan API (ke situs wordpress saya) untuk memungkinkan pengguna situs saya mengakses sub-domain.

Situs lain perlu mengautentikasi pengguna dari situs saya melalui semacam API.

Saya tidak yakin harus mulai dari mana, tetapi menurut saya ini sudah diketahui oleh orang yang lebih pintar dari saya. Terima kasih sebelumnya!

emersonthis
sumber
1
Apa jenis panggilan API yang akan dibutuhkan? Apa yang sedang Anda coba lakukan? Sudahkah Anda melihat dukungan XML-RPC WP ( codex.wordpress.org/XML-RPC_Support )?
anu
Situs lain perlu memverifikasi / mengotentikasi pengguna dari situs WP saya.
emersonthis

Jawaban:

16

Masalah Skrip Lintas Situs

Anda tidak dapat mentransfer cookie autentik WP antar domain. Anda juga tidak ingin menyimpan kata sandi plaintext untuk masuk ke instalasi WP lain secara terprogram. Jadi, Anda harus meminta pengguna masuk ke WordPress, dan kemudian mengakses status login mereka melalui titik akhir API dari situs pihak ketiga. Ini memungkinkan WordPress menangani semua otentikasi. Ini cukup aman karena pengguna harus masuk secara fisik ke sisi WP agar titik akhir API untuk menyajikan data kepada pihak ketiga.

Buat Titik Akhir API

Lihat artikel ini yang baru saja saya tulis di sini: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Anda juga dapat melihat demonstrasi kode di sini: https://gist.github.com/2982319

Anda harus mencari tahu logika untuk kebutuhan aplikasi Anda sendiri, tetapi ini akan memungkinkan Anda untuk membuat titik akhir di mana Anda dapat melayani apa pun yang Anda inginkan dari sisi WordPress.

Karena Anda menggunakan WordPress sebagai situs otentikasi, Anda dapat menggunakan tanda centang seperti is_user_logged_in (). Jika mereka masuk, kembalikan objek pengguna ke pihak ketiga dengan informasi apa pun yang mereka butuhkan.

Masuk Dari Pihak Ketiga

Dari pihak ketiga, mereka dapat menautkan ke halaman login Anda untuk pengalaman yang mulus menggunakan redirect_to kueri var. Setelah masuk, itu akan mengembalikan mereka ke situs pihak ketiga.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Login Jauh

Jika Anda perlu login pengguna ke WordPress dari situs pihak ketiga, Anda dapat menggunakan beberapa fungsi WP sederhana yang tercantum di situs ini: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Anda pasti harus menggunakan rahasia bersama dan membuat hash berdasarkan rahasia itu untuk menjaga keamanan. Pada dasarnya, inilah yang akan terlihat:

Pihak ketiga mengirimkan permintaan dengan cap waktu dan token yang dihasilkan oleh rahasia bersama:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Instalasi WordPress menerima permintaan:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!
Brian Fegter
sumber
Cukup yakin bahwa perangkat lunak pihak ke-3 itu tidak ada hubungannya dengan WP, jadi pada dasarnya itu adalah sistem masuk tunggal, tetapi dengan WP bertindak sebagai penyedia otentikasi.
anu
@ Alan: Benar.
emersonthis
@Brian: Saya tertarik dengan ide untuk beralih ke instalasi multi-situs, tapi saya tidak sepenuhnya mengerti poin yang Anda buat tentang cookie. Semua yang perlu terjadi adalah perangkat lunak pihak ke-3 perlu memverifikasi bahwa penggunanya sebenarnya adalah salah satu pengguna saya. Perangkat lunak ini mandiri, dan dapat menyediakan cookie sendiri atau apa pun.
emersonthis
@Emerson, saya mengerti sekarang. Maaf bila membingungkan. Anda bisa menggunakan ide titik akhir yang saya buat dan menggunakan token bersama dalam meta pengguna untuk otentikasi. Kembalikan respons JSON ke pihak ketiga jika pengguna ada.
Brian Fegter
1
Solusi yang sangat bagus Mungkin ada masalah jika aplikasi diinstal pada server yang berbeda dan dari beberapa alasan waktu masing-masing mesin berbeda. Saya akan menyarankan untuk menggunakan counteralih-alih time()dan meneruskannya dengan permintaan. Kedua belah pihak menjaga penghitung terakhir berlalu, dan ketika api menerima permintaan dengan penghitung baru, itu memverifikasi bahwa yang baru lebih besar dari yang terakhir. Dengan cara ini, penundaan tidak dapat membahayakan.
guyaloni