ไม่ได้ตั้งค่าคุกกี้ Laravel แม้ว่าจะมีส่วนหัวของ Set-cookie อยู่ก็ตาม

เรากำลังพัฒนาเว็บไซต์ด้วย REST Api (ส่วนหน้าใน AngularJS 1.6.1, แบ็กเอนด์ใน Laravel 5.3) ในการเพิ่มการป้องกัน CSRF แบ็กเอนด์ของเราต้องตั้งค่าคุกกี้แบ็กเอนด์บนไคลเอนต์ด้วยสตริงแบบสุ่ม ใน laravel เราจะส่งคืนการตอบกลับนี้: response("OK", 200)->cookie("csrf_token", "random_string");

คุกกี้ได้รับการตั้งค่าอย่างชัดเจนพร้อมการตอบสนอง:

*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

อย่างไรก็ตาม เมื่อฉันไปที่ URL http://backend.test ไม่มีการตั้งค่าคุกกี้ (document.cookie ใน คอนโซลส่งคืนค่าว่าง) แบ็กเอนด์ไม่เห็นคุกกี้เช่นกัน: dd($request->cookie("csrf_token") ส่งคืนค่าว่าง

มันจะไม่ทำงานแม้ว่าเราจะละเว้นโดเมนก็ตาม มีความคิดอะไรบ้าง?


person Giuseppe87    schedule 13.02.2017    source แหล่งที่มา


คำตอบ (2)


เพื่อให้ Angular ส่งคุกกี้ไปพร้อมกับคำขอใน CORS (คำขอแบ่งปันทรัพยากรข้ามแหล่งกำเนิด) คุณต้องตั้งค่าในการกำหนดค่าของคุณด้วย $httpProvider ที่ฉีดเป็นการพึ่งพา:

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

เมื่อคุณใช้ Laravel คุณไม่จำเป็นต้องตั้งค่าคุกกี้ csrf ด้วยตัวเอง Laravel จะทำงานนี้ให้คุณโดยอัตโนมัติ

ดังนั้น laravel จะสร้างคุกกี้โดยอัตโนมัติเพื่อจัดเก็บโทเค็น csrf ชื่อของคุกกี้นั้นคือ "XSRF-TOKEN"

person flienky    schedule 13.02.2017
comment
เรามีเซิร์ฟเวอร์ที่แตกต่างกันสองเครื่อง: เซิร์ฟเวอร์ส่วนหลัง (พร้อม laravel) และเซิร์ฟเวอร์ส่วนหน้า (พร้อม เชิงมุม) ดังนั้นงานนี้ซึ่งโดยปกติแล้ว laravel จะทำโดยอัตโนมัติจะไม่ทำงานกับสถาปัตยกรรมของเรา - person Giuseppe87; 13.02.2017