Apa cara yang benar untuk keluar dari folder yang dilindungi otentikasi HTTP?
Ada beberapa solusi yang dapat mencapai ini, tetapi mereka berpotensi berbahaya karena dapat buggy atau tidak berfungsi dalam situasi / browser tertentu. Itu sebabnya saya mencari solusi yang benar dan bersih.
php
authentication
.htaccess
http-headers
password-protection
Josef Sábl
sumber
sumber
Miscellaneous -> Clear Private Data -> HTTP Authentication
Jawaban:
Mu Tidak ada cara yang benar , tidak satu pun yang konsisten di seluruh browser.
Ini adalah masalah yang berasal dari spesifikasi HTTP (bagian 15.6):
Di sisi lain, bagian 10.4.2 mengatakan:
Dengan kata lain, Anda mungkin dapat menampilkan kotak login lagi (seperti kata @Karsten ), tetapi browser tidak harus memenuhi permintaan Anda - jadi jangan terlalu bergantung pada fitur (mis) ini.
sumber
Metode yang bekerja dengan baik di Safari. Juga berfungsi di Firefox dan Opera, tetapi dengan peringatan.
Ini memberi tahu browser untuk membuka URL dengan nama pengguna baru, menggantikan yang sebelumnya.
sumber
user:password@host
sudah tidak digunakan lagi. Hanya menggunakanhttp://[email protected]/
tidak dan harus bekerja dalam banyak kasus.Jawaban sederhana adalah bahwa Anda tidak dapat secara andal keluar dari autentikasi http.
Jawaban panjangnya:
Http-auth (seperti spesifikasi HTTP lainnya) dimaksudkan untuk menjadi stateless. Jadi "masuk" atau "keluar" sebenarnya bukan konsep yang masuk akal. Cara yang lebih baik untuk melihatnya adalah dengan bertanya, untuk setiap permintaan HTTP (dan ingat pemuatan halaman biasanya banyak permintaan), "apakah Anda diizinkan melakukan apa yang Anda minta?". Server melihat setiap permintaan sebagai baru dan tidak terkait dengan permintaan sebelumnya.
Peramban telah memilih untuk mengingat kredensial yang Anda beri tahu pada 401 pertama, dan mengirimnya kembali tanpa izin eksplisit pengguna atas permintaan berikutnya. Ini merupakan upaya untuk memberi pengguna model "masuk / keluar" yang mereka harapkan, tetapi ini murni kludge. Ini adalah browser yang mensimulasikan ketekunan negara ini. Server web sama sekali tidak menyadarinya.
Jadi "logout", dalam konteks http-auth adalah murni simulasi yang disediakan oleh browser, dan di luar otoritas server.
Ya, ada kludges. Tetapi mereka merusak ISTIRAHAT (jika itu bernilai bagi Anda) dan mereka tidak dapat diandalkan.
Jika Anda benar-benar memerlukan model masuk / keluar untuk otentikasi situs Anda, taruhan terbaik adalah cookie pelacakan, dengan persistensi status yang disimpan di server dalam beberapa cara (mysql, sqlite, flatfile, dll). Ini akan mengharuskan semua permintaan dievaluasi, misalnya, dengan PHP.
sumber
Penanganan masalah
Anda dapat melakukan ini menggunakan Javascript:
Apa yang dilakukan di atas adalah:
untuk IE - cukup bersihkan cache auth dan arahkan ke suatu tempat
untuk browser lain - kirim XMLHttpRequest di belakang layar dengan nama login dan kata sandi 'logout'. Kami perlu mengirimkannya ke beberapa jalur yang akan mengembalikan 200 OK untuk permintaan itu (artinya tidak memerlukan otentikasi HTTP).
Ganti
'/where/to/redirect'
dengan beberapa jalur untuk dialihkan ke setelah logout dan ganti'/path/that/will/return/200/OK'
dengan beberapa jalur di situs Anda yang akan mengembalikan 200 OK.sumber
Solusi (bukan solusi yang bersih, baik (atau bahkan berfungsi! Lihat komentar)):
Nonaktifkan kredensial satu kali.
Anda dapat memindahkan logika otentikasi HTTP ke PHP dengan mengirimkan tajuk yang sesuai (jika tidak masuk):
Dan parsing input dengan:
Jadi menonaktifkan kredensial satu kali harus sepele.
sumber
Logout dari HTTP Basic Auth dalam dua langkah
Katakanlah saya memiliki ranah Autentikasi HTTP Dasar yang bernama "Proteksi kata sandi", dan Bob masuk. Untuk keluar saya membuat 2 permintaan AJAX:
WWW-Authenticate: Basic realm="Password protected"
Pada titik ini browser lupa kredensial Bob.
sumber
Solusi saya untuk masalah ini adalah sebagai berikut. Anda dapat menemukan fungsinya
http_digest_parse
,$realm
dan$users
dalam contoh kedua halaman ini: http://php.net/manual/en/features.http-auth.php .sumber
Biasanya, setelah browser meminta kredensial pengguna dan memasok mereka ke situs web tertentu, ia akan terus melakukannya tanpa diminta lebih lanjut. Berbeda dengan berbagai cara Anda dapat menghapus cookie di sisi klien, saya tidak tahu cara serupa untuk meminta browser melupakan kredensial otentikasi yang disediakan.
sumber
Trac - secara default - juga menggunakan Otentikasi HTTP. Logout tidak berfungsi dan tidak bisa diperbaiki:
Dari: http://trac.edgewall.org/ticket/791#comment:103
Sepertinya tidak ada jawaban yang berfungsi untuk pertanyaan itu, masalah itu telah dilaporkan tujuh tahun lalu dan masuk akal: HTTP itu tidak bernegara. Salah satu permintaan dilakukan dengan kredensial otentikasi atau tidak. Tapi itu masalah klien yang mengirim permintaan, bukan server yang menerimanya. Server hanya dapat mengatakan apakah permintaan URI memerlukan otorisasi atau tidak.
sumber
Saya perlu mengatur ulang otorisasi .htaccess jadi saya menggunakan ini:
Ditemukan di sini: http://php.net/manual/en/features.http-auth.php
Sosok pergi.
Sejumlah solusi berada di halaman itu dan bahkan dicatat di bagian bawah: Lynx, tidak menghapus auth seperti browser lainnya;)
Saya mengujinya di browser yang diinstal dan sekali ditutup, setiap browser sepertinya secara konsisten memerlukan reauth pada masuk kembali.
sumber
WWW-Authenticate
itu menyebabkan masalah, menyingkirkan itu log out secara otomatis.WWW-Authenticate
sementara memperbaiki masalah di satu browser (Chrome) menyebabkan browser lain (Firefox) mengingat kredensial dan mengirimkannya pada permintaan berikutnya, menghasilkan login ulang otomatis! Argh!Ini mungkin bukan solusi yang dicari tetapi saya menyelesaikannya seperti ini. saya punya 2 skrip untuk proses logout.
logout.php
log.php
Dengan cara ini saya tidak mendapat peringatan dan sesi saya dihentikan
sumber
AFAIK, tidak ada cara bersih untuk mengimplementasikan fungsi "logout" saat menggunakan otentikasi htaccess (yaitu berbasis HTTP).
Ini karena otentikasi tersebut menggunakan kode kesalahan HTTP '401' untuk memberi tahu browser bahwa kredensial diperlukan, pada saat mana browser meminta detail dari pengguna. Sejak saat itu, hingga browser ditutup, itu akan selalu mengirim kredensial tanpa diminta lebih lanjut.
sumber
Solusi terbaik yang saya temukan sejauh ini (itu adalah semacam pseudo-code,
$isLoggedIn
variabel pseudo untuk http auth):Pada saat "logout" hanya menyimpan beberapa info ke sesi yang mengatakan bahwa pengguna benar-benar keluar.
Di tempat saya memeriksa otentikasi, saya memperluas kondisi:
Sesi agak ditautkan dengan status otentikasi http sehingga pengguna tetap logout selama dia tetap membuka browser dan selama otentikasi http tetap ada di browser.
sumber
Mungkin saya kehilangan intinya.
Cara paling andal yang saya temukan untuk mengakhiri otentikasi HTTP adalah dengan menutup browser dan semua jendela browser. Anda dapat menutup jendela browser menggunakan Javascript tapi saya rasa Anda tidak bisa menutup semua jendela browser.
sumber
Satu-satunya cara efektif saya telah menemukan untuk menghapus
PHP_AUTH_DIGEST
atauPHP_AUTH_USER
DANPHP_AUTH_PW
kredensial adalah untuk memanggil headerHTTP/1.1 401 Unauthorized
.sumber
Sementara yang lain benar dalam mengatakan bahwa tidak mungkin untuk logout dari otentikasi http dasar ada cara untuk menerapkan otentikasi yang berperilaku sama. Salah satu pendekatan yang jelas adalah menggunakan auth_memcookie . Jika Anda benar-benar ingin menerapkan otentikasi HTTP Dasar (mis. Gunakan dialog browser untuk masuk lebih dalam daripada bentuk HTTP) menggunakan ini - cukup setel otentikasi ke direktori terproteksi .htaccess terpisah yang berisi skrip PHP yang mengarahkan kembali ke tempat pengguna datang setelah membuat sesi memcache.
sumber
Ada banyak jawaban hebat - kompleks - di sini. Dalam kasus khusus saya, saya menemukan perbaikan yang bersih dan sederhana untuk logout. Saya belum menguji di Edge. Di halaman saya yang telah saya masuki, saya telah menempatkan tautan logout yang mirip dengan ini:
Dan di bagian atas halaman logout.html (yang juga dilindungi oleh .htaccess) saya memiliki refresh halaman yang mirip dengan ini:
Di mana Anda akan meninggalkan kata "logout" untuk menghapus nama pengguna dan kata sandi yang di-cache untuk situs tersebut.
Saya akui bahwa jika beberapa halaman harus dapat login langsung dari awal, masing-masing titik masuk akan membutuhkan halaman logout.html masing-masing yang sesuai. Kalau tidak, Anda bisa memusatkan logout dengan memperkenalkan langkah penjaga gerbang tambahan ke dalam proses sebelum prompt login yang sebenarnya, membutuhkan entri frasa untuk mencapai tujuan login.
sumber