Bagaimana cara memperbaiki kesalahan CORS saat mengambil data api di aplikasi React saya?

Saya baru-baru ini mengunggah proyek ASp.NET CORE React dengan Redux (dan KendoUI React) ke platform hosting Azure saya dan sekarang, saya tidak dapat mengakses data apa pun yang diambil dari API. Saya melihat konsol dan melihat pesan kesalahan:

Akses untuk mengambil di 'https://login.microsoftonline.com/xxx-xxx-xxx-xxx-xxx/oauth2/authorize?client_id=xxx-xxx-xxx-xxx-xxx&redirect_uri=https%3A%2F%2Fmywebsite.azurewebsites.net%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=xxx.xxxstate=xxx-xxx-xxx-xxx-xxxxxx&x-client-SKU=ID_NET&x-client-ver=2.1.4.0' (dialihkan dari 'https://mywebsite.azurewebsites.net/api/MyData/GetMyData?page=1&pageSize=20') dari asal 'https://mywebsite.azurewebsites.net ' telah diblokir oleh kebijakan CORS: Tidak ada header 'Access-Control-Allow-Origin' pada sumber daya yang diminta. Jika respons buram memenuhi kebutuhan Anda, setel mode permintaan ke 'no-cors' untuk mengambil sumber daya dengan CORS dinonaktifkan.

Saya menyelidiki masalahnya dengan mencari pesan kesalahan, saya menemukan beberapa posting tetapi tidak ada yang konkret tentang apa yang harus dilakukan dalam aplikasi reaksi yang merupakan praktik terbaik dan juga aman.

Saya menambahkan header Access-Control-Allow-Origin: * ke pengambilan saya tetapi tidak berhasil. Metode lain yang saya temukan adalah dengan menggunakan proxy tetapi contohnya hanya mendukung lingkungan pengembangan lokal.

Ini pengambilan saya di mana Anda dapat melihat saya menambahkan Access-Control-Allow-Origin ke header:

fetchData(dataState) {
    const queryStr = `${toDataSourceRequestString(dataState)}`;
    const hasGroups = dataState.group && dataState.group.length;
    const base_url = 'api/MyData/GetMyData';
    const init = { method: 'GET', accept: 'application/json', headers: "Access-Control-Allow-Origin: *" };

    fetch(`${base_url}?${queryStr}`, init)
        .then(response => response.json())
        .then(({ Data, total }) => {
                this.setState({
                    result: hasGroups ? translateDataSourceResultGroups(Data) : Data,
                    total,
                    dataState
                });
            }).catch(function (error) {
                console.log('Error: \n', error);
            });
};

Menambahkan tajuk tidak mengubah apa pun dan kesalahan terus berlanjut. Saya ingin memastikan saya melakukan ini dengan benar, adakah yang bisa membantu saya memperbaiki kesalahan ini?


person Yanayaya    schedule 25.04.2019    source sumber


Jawaban (2)


Access-Control-Allow-Origin adalah header respons. Itu hanya dapat diatur oleh server. Server menentukan apakah ia menerima permintaan lintas situs atau tidak dan dalam hal ini, server mengatakan tidak. Tidak ada jalan lain.

Tampaknya Anda mencoba menjangkau server Azure Anda tetapi server tersebut dialihkan ke halaman login Microsoft. Pastikan Anda dapat mengakses server tanpa pengalihan saat membuat permintaan. Pastikan juga kode JavaScript Anda berjalan di domain yang sama (saya berasumsi demikian), jika tidak, konfigurasikan CORS di server web: https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2

person gerwin    schedule 25.04.2019
comment
Ini adalah perilaku yang membingungkan, saya sudah login tetapi masih mencoba mengalihkan ke halaman login. Itu aneh. Saya menggunakan dokumentasi tertaut dari Microsoft tetapi kesalahan yang sama muncul. - person Yanayaya; 25.04.2019
comment
Ya itu harus terkait dengan server Anda. Jika Anda melihat lebih dekat kesalahannya, dikatakan bahwa kesalahan itu dialihkan dari https://mywebsite.azurewebsites.net/api/MyData/GetMyData?page=1&pageSize=20. Ini adalah kode server Anda. Kemungkinan besar Anda membuat kesalahan konfigurasi yang mencegah siapa pun mengakses server Anda tanpa otentikasi Microsoft. Sudahkah Anda mengatur Keamanan di Layanan Aplikasi Anda? Hal lain yang mungkin menyebabkan perilaku ini? Jika Anda PM saya titik akhir sebenarnya, saya bisa melihatnya. - person gerwin; 26.04.2019

Gunakan https://cors-anywhere.herokuapp.com tambahkan ini ke api Anda

eg: https://cors-anywhere.herokuapp.com/user/list

Ini adalah proxy publik dan tidak ada kendali atas siapa yang melihat datanya, jangan membebani server proxy. yang terbaik adalah menerapkan proxy Anda sendiri jika tidak mungkin mengubah api biru.

person Dheeraj    schedule 25.04.2019
comment
Harap perhatikan mulai Januari 2021, cors-anywhere sekarang sangat dibatasi dan mungkin tidak lagi menjadi solusi yang valid. github.com/Rob--W/cors-anywhere/issues/301 - person Neil Monroe; 08.03.2021