Integrasi SSO / otentikasi dengan 'layanan direktori' eksternal

15

Saya akan mulai mengerjakan prototipe untuk klien - dan salah satu fitur yang diperlukan adalah integrasi dengan sistem otentikasi / registrasi pengguna internal.

Sistem ini akan bertindak sebagai basis data pengguna yang resmi, dan menyediakan antarmuka yang TENANG untuk membuat pengguna baru, dan mengautentikasi pengguna yang valid.

  1. Saya harus dapat membuat pengguna baru di WP dan sebagai bagian dari proses itu membuat panggilan ke API otentikasi eksternal untuk membuat / memvalidasi pengguna itu.

  2. Seseorang yang adalah pengguna yang valid tetapi tidak dikenal oleh WP harus dapat login untuk berkomentar, tanpa harus mendaftar di situs WP sendiri.

  3. Seseorang yang masuk ke situs web keseluruhan juga harus secara otomatis masuk ke WordPress.

Saya pikir yang berikut ini adalah jalan yang harus ditempuh.

  • Untuk (1) - apakah ada kait registrasi yang dapat saya gunakan?

  • Untuk (2) - Saya berasumsi saya mengaitkan filter otentikasi - yaitu ketika seseorang mencoba masuk, saya menjebaknya, melakukan panggilan ke sistem eksternal, dan kemudian memproses login WP atau mengarahkan mereka ke proses pendaftaran di mana ( 1) menerima tawaran.

  • Untuk (3) - baca cookie login yang ditetapkan oleh situs utama dan lanjutkan dengan (2)?

Saya kira saya juga harus memasukkan catatan ke tabel pengguna dan usermeta.

Jadi, apakah hal di atas masuk akal - saya belum memikirkan sesuatu. Siapa pun punya sumber daya yang bagus untuk membantu dengan ini (@reak - Saya melihat Anda telah melakukan beberapa pekerjaan dalam hal ini !!).

Memperbarui

Jadi saya masih sedikit membenturkan kepala terhadap hal ini, pada dasarnya saya mencoba menghubungkan ke filter otentikasi, dan menggunakannya untuk:

  1. memeriksa apakah cookie masuk untuk situs 'master' telah ditetapkan, dan jika ya, validasi ulang terhadap API autentikasi mereka, dan jika valid, paksa masuk dengan WP wp_signon(), menggunakan informasi yang terkandung dalam cookie situs master (email dan kata sandi hash) sebagai kredensial untuk WP
  2. jika cookie tidak disetel, arahkan ke halaman login situs master dan dapatkan login / pendaftaran lalu kembali ke langkah 1
  3. jika tidak ada pengguna WP ketika ada pengguna situs master yang diautentikasi, buatlah dan kemudian jadi 'transparan' (yaitu agar pengguna tidak melihat formulir login WP)

Pada dasarnya, saya ingin menyembunyikan formulir login WP sepenuhnya untuk pengguna yang hanya akan berkomentar, dan kemudian menemukan cara untuk memungkinkan penulis dan admin untuk mengaksesnya secara langsung.

Ini berjalan cukup lambat, inilah yang bisa saya gunakan bantuan:

  • apakah filter otentikasi yang tepat untuk digunakan? Tampaknya tidak dipanggil dalam semua situasi yang saya harapkan - misalnya widget meta menampilkan tautan masuk / keluar tanpa penguncian kait autentikasi

  • saya bisa wp_signon()mengembalikan WP_Userobjek (menunjukkan keberhasilan), tetapi itu tidak mempengaruhi status login - yaitu widget meta masih akan ditampilkan di "Login" bahkan setelah menyegarkan.

Setiap bantuan dengan penuh terima kasih :)

anu
sumber
mungkin ini harus menjadi pertanyaan terpisah?
anu
oh, dan saya tidak tahu apakah ini diizinkan untuk disebutkan, tetapi saya akan dengan senang hati membayar bantuan setengah hari atau lebih untuk ini - detail kontak di profil saya.
anu

Jawaban:

12

OK, pendekatan yang bekerja untuk saya adalah sebagai berikut:

  1. Asumsikan bahwa basis data pengguna situs utama adalah otoritatif. Cookie login situs utama berisi ID dan hash kata sandi situs.

  2. Dapatkan cookie dari situs utama dan validasi ulang terhadap API autentikasi situs utama

  3. Jika valid, gunakan alamat email dari nilai balik sebagai 'user_login' nilai untuk WP, dan kata sandi situs hash sebagai kata sandi WP.

  4. Uji apakah pengguna ini ada di WP dengan menggunakan wp_authenticate('user_login', 'user_pass'). Ini mengembalikan aWP_User objek pada kesuksesan, atau WP_Errorobjek pada kegagalan.

  5. Jika WP_Error/is_wp_error() , kemudian gunakan gunakan wp_update_user()untuk membuat pengguna (atau memperbarui pengguna dengan kata sandi yang diubah).

  6. Login melalui wp_set_current_user(),wp_set_auth_cookie() dando_action('wp_login, id)

(Ini semua terkandung dalam fungsi yang terlampir pada 'init'tindakan)

Ini tampaknya berfungsi - pengguna situs yang valid yang tidak dikenal dengan WP secara otomatis dibuat. Perubahan kata sandi dipenuhi, dan jika cookie situs diatur, dan pengguna WP ada, SSO otomatis dan sangat mulus.

anu
sumber
1
+1 Deskripsi / jawaban yang mengagumkan. Semoga Anda menemukan waktu satu hari untuk menunjukkan sedikit lebih banyak detail suatu hari. Akan membantu kita yang lain untuk menghindari sebagian besar persidangan / erro;)
kaiser
1
Ini persis apa yang saya cari, dapatkah Anda menjelaskan sedikit lebih banyak tentang prosesnya? Khususnya langkah 1,2,3 tidak begitu jelas bagi saya. Terima kasih!!
chifliiiii
3

Seluruh sistem otentikasi dapat dicolokkan. Saya sarankan melihat plugin yang ada untuk mendapatkan ide bagaimana menimpa sistem. Mungkin dengan melihat beberapa plugin LDAP ?

Dougal Campbell
sumber
Ya dan tanpa bermaksud menjadi snarky, itu sudah jelas !!
anu
Untuk beberapa info yang mungkin membantu mencerminkan status pengguna yang masuk, lihat jawaban saya untuk pertanyaan lain ini: wordpress.stackexchange.com/questions/8998/…
Dougal Campbell
1

Beberapa fungsi yang berhubungan dengan pengguna didefinisikan kondisional pada !function_exists()di wp-includes/pluggable.phpdan mudah untuk menimpa dengan versi Anda sendiri.

Jarang
sumber
1

Mengaktifkan Single-Sign-On di WordPress membutuhkan waktu lebih dari 18 jam untuk saya tetapi mungkin hanya perlu beberapa menit:

Pada dasarnya, Anda ingin menggunakan https://wordpress.org/plugins/wp-force-login/ dan versi modifikasi https://as.wordpress.org/plugins/jwt-authenticator/ dan kemudian membuat auth endpoint yang dilindungi di situs utama Anda yang menghasilkan JWT (JSON Web Token) dan mengarahkan kembali ke URL khusus situs WordPress Anda.

Lihat kode lengkap di sini .

Ryan
sumber
Terima kasih atas jawaban anda. Tautan yang hanya berisi jawaban tidak disarankan karena tautan dapat lenyap dan membuat Anda menjawab tidak berguna. Lebih baik untuk memasukkan bit yang relevan di sini.
kaiser