Saya mengirim permintaan dari klien ke server Express.js saya menggunakan Axios.
Saya menetapkan cookie pada klien dan saya ingin membaca cookie itu dari semua permintaan Axios tanpa menambahkannya secara manual ke permintaan secara manual.
Ini adalah contoh permintaan sisi klien saya:
axios.get(`some api url`).then(response => ...
Saya mencoba mengakses header atau cookie dengan menggunakan properti ini di server Express.js saya:
req.headers
req.cookies
Tak satu pun dari mereka berisi cookie. Saya menggunakan middleware parser cookie:
app.use(cookieParser())
Bagaimana cara membuat Axios mengirim cookie dalam permintaan secara otomatis?
Edit:
Saya mengatur cookie pada klien seperti ini:
import cookieClient from 'react-cookie'
...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
axios.get('path/to/my/cookie/api').then(response => {
if(response.status == 200){
cookieClient.save('cookie-name', response.data, {path:'/'})
}
})
}
...
Meskipun juga menggunakan Axios, ini tidak relevan dengan pertanyaannya. Saya hanya ingin menyematkan cookie ke semua permintaan saya setelah cookie disetel.
Jawaban:
Saya memiliki masalah yang sama dan memperbaikinya dengan menggunakan
withCredentials
properti.XMLHttpRequest dari domain lain tidak dapat menyetel nilai cookie untuk domain mereka sendiri kecuali withCredentials disetel ke true sebelum membuat permintaan.
sumber
Access-Control-Allow-Origin
header respons tidak disetel ke wildcard (*)Access-Control-Allow-Origin
tidak disetel ke*
itu berarti, saya tidak akan membuat permintaan ke server itu karena hak CORSAccess-Control-Allow-Origin
ke nilai domain tempat Anda ingin membuat permintaan XHR. misalnyahttps://a.com
adalah server,https://b.com
adalah klien, danhttps://b.com
dimuat di browser seseorang dan digunakanXMLHTTPRequest
untuk membuat permintaanhttps://a.com
. SelainXMLHTTPRequest
(diinisiasihttps://a.com
) untuk disetelwithCredential: true
, server -https://b.com
juga perlu dikonfigurasi agar header respons berisiAccess-Control-Allow-Origin: https://a.com
TL; DR:
{ withCredentials: true }
atauaxios.defaults.withCredentials = true
Dari dokumentasi axios
withCredentials
menunjukkan apakah permintaan Kontrol Akses lintas situs harus dibuat menggunakan kredensial atau tidakJika Anda lulus
{ withCredentials: true }
dengan permintaan Anda, itu akan berhasil.Cara yang lebih baik akan menetapkan
withCredentials
sebagaitrue
diaxios.defaults
sumber
Saya kurang paham dengan Axios, tapi setahu saya di javascript dan ajax ada opsi
Ini secara otomatis akan mengirim cookie ke sisi klien. Sebagai contoh, skenario ini juga dibuat dengan passportjs, yang menetapkan cookie di server
sumber
Penting juga untuk menyetel tajuk yang diperlukan dalam tanggapan cepat. Ini adalah yang berhasil untuk saya:
sumber
X-PINGOTHER
ke dalamAccess-Control-Allow-Headers
(Node.js 6.9 dengan Express 4.16, Chrome 63). Periksa posting JakeElder tentang masalah GitHub ini: github.com/axios/axios/issues/191#issuecomment-311069164Solusi lain adalah dengan menggunakan pustaka ini:
https://github.com/3846masa/axios-cookiejar-support
yang mengintegrasikan dukungan "Cookie Tangguh" ke Axios. Perhatikan bahwa pendekatan ini masih membutuhkan
withCredentials
flag.sumber
bagi orang-orang yang masih belum bisa menyelesaikannya, jawaban ini membantu saya. jawaban stackoverflow: 34558264
TLDR; seseorang perlu menyetel
{withCredentials: true}
permintaan GET dan juga permintaan POST (mendapatkan cookie) untuk axios dan juga fetch.sumber
{ withCredentials: true }
permintaan GET tidak berpengaruh apa pun.withCredentials: true
ke konfigurasi permintaan tetapi tidak detail ini. Saya menghabiskan hampir 2 hari mencoba untuk memecahkan masalah sampai saya menemukan iniset
axios.defaults.withCredentials = true;
atau untuk beberapa permintaan khusus yang dapat Anda gunakan
axios.get(url,{withCredentials:true})
misalnya: jika front-end Anda yang membuat permintaan berjalan di localhost: 3000, maka setel header respons sebagai
juga diatur
sumber
Anda dapat menggunakan
withCredentials
properti untuk mengirimkan cookie dalam permintaan.Dengan menyetelnya,
{ withCredentials: true }
Anda mungkin mengalami masalah lintas sumber. Untuk mengatasinya, Anda perlu menggunakanDi sini Anda dapat membaca tentang withCredentials
sumber
Anda mendapatkan dua pemikiran yang bercampur.
Anda memiliki "react-cookie" dan "axios"
react-cookie => digunakan untuk menangani cookie di sisi klien
axios => untuk mengirim permintaan ajax ke server
Dengan info itu, jika Anda ingin cookie dari sisi klien juga dikomunikasikan di sisi backend, Anda perlu menghubungkannya bersama.
Catatan dari "react-cookie" Readme:
tautan ke readme
Jika ini yang Anda butuhkan, bagus.
Jika tidak, mohon beri komentar agar saya bisa menjelaskan lebih lanjut.
sumber
plugToRequest
tepatnya yang dilakukannya? Saya berpikir untuk mengakses cookie di server node, semua yang dibutuhkan adalahcookie-parser
middleware (dengan asumsi Express)?Jadi saya memiliki masalah yang sama persis dan kehilangan sekitar 6 jam pencarian hidup saya, saya memiliki file
withCredentials: true
Tetapi browser masih tidak menyimpan cookie sampai karena beberapa alasan aneh saya punya ide untuk mengacak pengaturan konfigurasi:
Sepertinya Anda harus selalu mengirim Kunci 'withCredentials' terlebih dahulu.
sumber