Saya mencoba menerapkan kode berikut, tetapi ada sesuatu yang tidak berfungsi. Ini kodenya:
var session_url = 'http://api_address/api/session_endpoint';
var username = 'user';
var password = 'password';
var credentials = btoa(username + ':' + password);
var basicAuth = 'Basic ' + credentials;
axios.post(session_url, {
headers: { 'Authorization': + basicAuth }
}).then(function(response) {
console.log('Authenticated');
}).catch(function(error) {
console.log('Error on Authentication');
});
Ini mengembalikan kesalahan 401. Saat saya melakukannya dengan Postman, ada opsi untuk menyetel Basic Auth; jika saya tidak mengisi kolom tersebut, ia juga mengembalikan 401, tetapi jika saya melakukannya, permintaan berhasil.
Ada ide apa yang saya lakukan salah?
Berikut adalah bagian dari dokumen API tentang cara mengimplementasikannya:
Layanan ini menggunakan informasi otentikasi dasar di header untuk membuat sesi pengguna. Kredensial divalidasi terhadap Server. Menggunakan layanan web ini akan membuat sesi dengan kredensial pengguna yang diteruskan dan mengembalikan JSESSIONID. JSESSIONID ini dapat digunakan dalam permintaan berikutnya untuk melakukan panggilan layanan web. *
Alasan kode dalam pertanyaan Anda tidak diautentikasi adalah karena Anda mengirimkan autentikasi di objek data, bukan di konfigurasi, yang akan meletakkannya di header. Per docs axio , yang permintaan metode alias untuk
post
adalah:Oleh karena itu, agar kode Anda berfungsi, Anda perlu mengirim objek kosong untuk data:
Hal yang sama juga berlaku untuk menggunakan parameter auth yang disebutkan oleh @luschn. Kode berikut ini setara, tetapi menggunakan parameter auth sebagai gantinya (dan juga meneruskan objek data kosong):
sumber
Untuk beberapa alasan, masalah sederhana ini memblokir banyak pengembang. Saya berjuang selama berjam-jam dengan hal sederhana ini. Masalah ini banyak dimensi:
CORS
Setup saya untuk pengembangan adalah dengan aplikasi webpack vuejs yang berjalan di localhost: 8081 dan aplikasi boot musim semi yang berjalan di localhost: 8080. Jadi saat mencoba memanggil rest API dari frontend, tidak mungkin browser mengizinkan saya menerima respons dari spring backend tanpa pengaturan CORS yang tepat. CORS dapat digunakan untuk melonggarkan perlindungan Cross Domain Script (XSS) yang dimiliki browser modern. Seperti yang saya pahami, browser melindungi SPA Anda dari serangan XSS. Tentu saja, beberapa jawaban di StackOverflow menyarankan untuk menambahkan plugin chrome untuk menonaktifkan perlindungan XSS tetapi ini benar-benar berfungsi DAN jika ya, hanya akan mendorong masalah yang tak terhindarkan untuk nanti.
Konfigurasi CORS backend
Inilah cara Anda mengatur CORS di aplikasi boot musim semi Anda:
Tambahkan kelas CorsFilter untuk menambahkan header yang tepat sebagai respons terhadap permintaan klien. Access-Control-Allow-Origin dan Access-Control-Allow-Headers adalah hal terpenting yang harus dimiliki untuk otentikasi dasar.
Tambahkan kelas konfigurasi yang memperluas Spring WebSecurityConfigurationAdapter. Di kelas ini Anda akan menyuntikkan filter CORS Anda:
Anda tidak perlu meletakkan apapun yang berhubungan dengan CORS di controller Anda.
Paling depan
Sekarang, di frontend Anda perlu membuat kueri axios Anda dengan header Otorisasi:
Semoga ini membantu.
sumber
Contoh (axios_example.js) menggunakan Axios di Node.js:
Pastikan di direktori proyek Anda, Anda melakukan:
Anda kemudian dapat menguji Node.js REST API menggunakan browser Anda di:
http://localhost:5000/search?queryStr=xxxxxxxxx
Ref: https://github.com/axios/axios
sumber
Solusi yang diberikan oleh luschn dan pillravi berfungsi dengan baik kecuali Anda menerima tajuk Strict-Transport-Security sebagai tanggapan.
Menambahkan withCredentials: true akan menyelesaikan masalah itu.
sumber
Jika Anda mencoba melakukan autentikasi dasar, Anda dapat mencoba ini:
Ini berhasil untuk saya. Semoga membantu
sumber