Laravel Cookie tidak disetel meskipun ada header Set-cookie

Kami sedang mengembangkan situs web dengan REST Api (frontend di AngularJS 1.6.1, backend di Laravel 5.3). Untuk menambahkan perlindungan CSRF, backend kami perlu menyetel cookie backend pada klien dengan string acak. Di laravel, kami mengembalikan respons ini: respon("OK", 200)->cookie("csrf_token", "random_string");

Cookie jelas sedang disetel dengan respons:

*Request headers*
POST /v1/auth/admin HTTP/1.1
Host: backend.test
Connection: keep-alive
Content-Length: 295
Accept: */*
Origin: http://frontend.test
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://frontend.test/login
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4

*Response header*
HTTP/1.1 200 OK
Server: nginx/1.11.3
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: http://frontend.test
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH
Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Requested-With
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Date: Mon, 13 Feb 2017 11:46:16 GMT
Set-Cookie: csrf_token=random_string; expires=Sat, 12-Feb-2022 11:46:16 GMT; Max-Age=157680000; path=/; domain=http://backend.test; HttpOnly

Namun, ketika saya membuka Url http://backend.test, tidak ada cookie yang disetel (document.cookie di konsol mengembalikan nol). Backend juga tidak dapat melihat cookie: dd($request->cookie("csrf_token") mengembalikan null.

Itu tidak berfungsi meskipun kami menghilangkan domainnya. Ada ide?


person Giuseppe87    schedule 13.02.2017    source sumber


Jawaban (2)


Agar Angular mengirim cookie bersama dengan permintaan dalam CORS (permintaan Berbagi Sumber Daya Lintas Asal), Anda perlu mengatur, dalam konfigurasi Anda dengan $httpProvider yang disuntikkan sebagai ketergantungan:

.config(function ($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
    //rest of route code
}
person Luca Puddu    schedule 13.02.2017

Saat Anda menggunakan Laravel Anda tidak perlu mengatur cookie csrf sendiri. Laravel secara otomatis melakukan pekerjaan ini untuk Anda.

Jadi laravel secara otomatis membuat cookie untuk menyimpan token csrf. Nama cookie itu adalah "XSRF-TOKEN".

person flienky    schedule 13.02.2017
comment
Kami memiliki dua server berbeda: server backend (dengan laravel) dan server frontend (dengan Angularjs). Jadi pekerjaan yang biasanya dilakukan laravel secara otomatis tidak berfungsi dengan arsitektur kita. - person Giuseppe87; 13.02.2017