Apakah mungkin untuk logout pengguna dari situs web jika dia menggunakan otentikasi dasar?
Sesi pembunuhan tidak cukup, karena, setelah pengguna diautentikasi, setiap permintaan berisi info masuk, sehingga pengguna secara otomatis login di lain waktu ia mengakses situs menggunakan kredensial yang sama.
Satu-satunya solusi sejauh ini adalah menutup browser, tetapi itu tidak dapat diterima dari sudut pandang kegunaan.
/
halaman, mereka akan secara otomatis login lagi.Jawaban:
Otentikasi dasar tidak dirancang untuk mengelola keluar. Anda dapat melakukannya, tetapi tidak sepenuhnya secara otomatis.
Yang harus Anda lakukan adalah meminta pengguna mengklik tautan logout, dan mengirim tanggapan '401 Tidak Sah', menggunakan ranah yang sama dan pada tingkat folder URL yang sama seperti 401 normal yang Anda kirim meminta login.
Mereka harus diarahkan untuk memasukkan kredensial yang salah selanjutnya, mis. nama pengguna dan kata sandi kosong, dan sebagai tanggapan Anda mengirim kembali halaman "Anda telah berhasil keluar". Kredensial yang salah / kosong kemudian akan menimpa kredensial yang benar sebelumnya.
Singkatnya, skrip logout membalikkan logika skrip login, hanya mengembalikan halaman sukses jika pengguna tidak melewati kredensial yang tepat.
Pertanyaannya adalah apakah kotak kata sandi “jangan masukkan kata sandi” yang agak aneh akan memenuhi penerimaan pengguna. Pengelola kata sandi yang mencoba mengisi kata sandi secara otomatis juga dapat menghalangi di sini.
Sunting untuk menambahkan sebagai tanggapan terhadap komentar: masuk kembali adalah masalah yang sedikit berbeda (kecuali Anda memerlukan logout / login dua langkah jelas). Anda harus menolak (401) upaya pertama untuk mengakses tautan relogin, daripada menerima yang kedua (yang mungkin memiliki nama pengguna / kata sandi lain). Ada beberapa cara Anda bisa melakukan ini. Salah satunya adalah memasukkan nama pengguna saat ini di tautan logout (mis. / Relogin? Nama pengguna), dan menolak ketika kredensial cocok dengan nama pengguna.
sumber
Tambahan untuk jawaban oleh bobince ...
Dengan Ajax Anda dapat memiliki tautan / tombol 'Logout' Anda terhubung ke fungsi Javascript. Minta fungsi ini mengirim XMLHttpRequest dengan nama pengguna dan kata sandi yang buruk. Ini akan mendapatkan 401. Kemudian atur document.location kembali ke halaman pra-login. Dengan cara ini, pengguna tidak akan pernah melihat dialog login tambahan selama logout, atau harus ingat untuk memasukkan kredensial yang buruk.
sumber
Minta pengguna mengklik tautan ke https: // log: [email protected]/ . Itu akan menimpa kredensial yang ada dengan yang tidak valid; logout mereka.
sumber
Anda dapat melakukannya seluruhnya dalam JavaScript:
IE memiliki (untuk waktu yang lama) API standar untuk membersihkan cache Otentikasi Dasar:
Harus mengembalikan true ketika berfungsi. Mengembalikan salah, tidak terdefinisi atau meledak di browser lain.
Peramban baru (per Des 2012: Chrome, FireFox, Safari) memiliki perilaku "ajaib". Jika mereka melihat permintaan autentik dasar yang berhasil dengan sembarang nama pengguna palsu lainnya (katakanlah
logout
) mereka menghapus cache kredensial dan mungkin menyetelnya untuk nama pengguna palsu baru itu, yang perlu Anda pastikan bukan nama pengguna yang valid untuk melihat konten.Contoh dasar dari itu adalah:
Cara "asinkron" untuk melakukan hal di atas adalah dengan melakukan panggilan AJAX menggunakan
logout
nama pengguna. Contoh:Anda juga dapat menjadikannya bookmarklet:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
sumber
logout
pengguna khusus untuk nama pengguna dan / atau URL logout?logout
kebetulan ada dan kebetulan memiliki kata sandi yang dihasilkan. Dalam kasus yang jarang terjadi, ubah ID pengguna menjadi yang tidak ada di sistem Anda.<a href='javascript:......need*/);'>Logout</a>
Fungsi berikut ini dikonfirmasikan berfungsi untuk Firefox 40, Chrome 44, Opera 31 dan IE 11.
Bowser digunakan untuk deteksi browser, jQuery juga digunakan.
- secUrl adalah url ke area yang dilindungi kata sandi tempat untuk keluar.
- redirUrl adalah url ke area yang tidak dilindungi kata sandi (halaman kesuksesan logout).
- Anda mungkin ingin menambah pengalihan waktu (saat ini 200 ms).
sumber
$.ajax
varian sinkron (async: false
) danxmlhttp
varian asinkron (true
dalamopen()
)?(bowser.gecko)
ke(bowser.gecko || bowser.blink)
.$.ajax
dan menggunakan webkitnew XMLHttpRequest
? Tidakkah tokek / blink dapat melakukannyaXMLHttpRequest
dan webkit juga bisa melakukannya$.ajax
? Saya bingung.Berikut ini adalah contoh Javascript yang sangat sederhana menggunakan jQuery:
Pengguna log ini keluar tanpa menunjukkan kotak log-in browser lagi, lalu mengarahkannya ke halaman yang sudah keluar
sumber
Ini tidak mungkin secara langsung dengan Otentikasi-Dasar.
Tidak ada mekanisme dalam spesifikasi HTTP untuk server untuk memberitahu browser untuk berhenti mengirim kredensial yang sudah disajikan pengguna.
Ada "retasan" (lihat jawaban lain) yang biasanya melibatkan penggunaan XMLHttpRequest untuk mengirim permintaan HTTP dengan kredensial yang salah untuk menimpa yang semula disediakan.
sumber
Ini berfungsi untuk IE / Netscape / Chrome:
sumber
Ini sebenarnya cukup sederhana.
Cukup kunjungi yang berikut ini di browser Anda dan gunakan kredensial yang salah: http: // username: [email protected]
Itu harus "mengeluarkan Anda".
sumber
Yang Anda butuhkan hanyalah mengarahkan pengguna pada beberapa URL logout dan mengembalikan
401 Unauthorized
kesalahan padanya. Pada halaman kesalahan (yang harus dapat diakses tanpa auth dasar) Anda perlu memberikan tautan lengkap ke halaman rumah Anda (termasuk skema dan nama host). Pengguna akan mengklik tautan ini dan browser akan meminta kredensial lagi.Contoh untuk Nginx:
Halaman kesalahan
/home/user/errors/401.html
:sumber
http_host
di401.html
bukan hanyahost
, sebagai mantan juga menambahkan nomor port (dalam kasus port non-standar yang digunakan)sumber
sumber
Berdasarkan apa yang saya baca di atas, saya mendapat solusi sederhana yang berfungsi di browser apa pun:
1) pada halaman logout Anda, Anda memanggil ajax ke bagian login Anda Bagian belakang login Anda harus menerima pengguna logout. Setelah bagian belakang menerima, browser menghapus pengguna saat ini dan mengasumsikan pengguna "logout".
2) Sekarang ketika pengguna kembali ke file indeks normal itu akan mencoba untuk masuk secara otomatis dalam sistem dengan pengguna "logout", pada kali kedua ini Anda harus memblokirnya dengan membalas dengan 401 untuk memunculkan dialog login / kata sandi.
3) Ada banyak cara untuk melakukan itu, saya membuat dua ujung belakang login, satu menerima pengguna logout dan satu lagi tidak. Halaman login normal saya menggunakan yang tidak menerima, halaman logout saya menggunakan yang menerimanya.
sumber
Saya baru saja menguji yang berikut di Chrome (79), Firefox (71) dan Edge (44) dan berfungsi dengan baik. Itu berlaku solusi skrip seperti yang disebutkan di atas.
Cukup tambahkan tautan "Logout" dan ketika diklik kembalikan html berikut
sumber
JavaScript ini harus berfungsi untuk semua browser versi terbaru:
sumber
tambahkan ini ke aplikasi Anda:
sumber
ketik
chrome://restart
bilah alamat dan chrome, dengan semua aplikasi yang berjalan di latar belakang, akan dimulai ulang dan cache kata sandi Auth akan dibersihkan.sumber
Sebagai catatan, ada Header HTTP Response baru yang disebut
Clear-Site-Data
. Jika balasan server Anda menyertakanClear-Site-Data: "cookies"
tajuk, maka kredensial otentikasi (tidak hanya cookie) harus dihapus. Saya mengujinya di Chrome 77 tetapi peringatan ini muncul di konsol:Dan kredensial auth tidak dihapus, jadi ini tidak berfungsi (untuk saat ini) untuk menerapkan logout auth dasar, tapi mungkin di masa depan akan. Tidak menguji pada browser lain.
Referensi:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data
https://www.w3.org/TR/clear-site-data/
https://github.com/w3c/webappsec-clear-site-data
https://caniuse.com/#feat=mdn-http_headers_clear-site-data_cookies
sumber
Mengirim
https://invalid_login@hostname
berfungsi dengan baik di mana saja kecuali Safari di Mac (well, tidak mencentang Edge tetapi juga berfungsi di sana).Logout tidak berfungsi di Safari ketika pengguna memilih 'ingat kata sandi' di sembulan HTTP Otentikasi Dasar. Dalam hal ini kata sandi disimpan di Akses Keychain (Finder> Aplikasi> Utilitas> Akses Keychain (atau CMD + SPACE dan ketik "Akses Keychain")). Mengirim
https://invalid_login@hostname
tidak mempengaruhi Akses Keychain, jadi dengan kotak centang ini tidak mungkin untuk logout di Safari pada Mac. Setidaknya itu cara kerjanya untuk saya.MacOS Mojave (10.14.6), Safari 12.1.2.
Kode di bawah ini berfungsi dengan baik untuk saya di Firefox (73), Chrome (80) dan Safari (12). Ketika pengguna menavigasi ke halaman logout kode dieksekusi dan menjatuhkan kredensial.
Juga karena suatu alasan Safari tidak menyimpan kredensial dalam sembulan HTTP Otentikasi Dasar bahkan ketika 'ingat kata sandi' dipilih. Browser lain melakukan ini dengan benar.
sumber
sumber
Saya memperbarui solusi mthoring untuk versi Chrome modern:
sumber