Estamos desarrollando un sitio web con una API REST (interfaz en AngularJS 1.6.1, back-end en Laravel 5.3). Para agregar protección CSRF, nuestro servidor necesita establecer una cookie de servidor en el cliente con una cadena aleatoria. En laravel, devolvemos esta respuesta: respuesta ("OK", 200) -> cookie ("csrf_token", "random_string");

La cookie se configura claramente con la respuesta:

*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

Sin embargo, cuando voy a la URL http: //backend.test, no se establece ninguna cookie (document.cookie en el consola devuelve nulo). El backend tampoco puede ver la cookie: dd ($ request-> cookie ("csrf_token") devuelve nulo.

No funciona incluso si omitimos el dominio. ¿Algunas ideas?

2
Giuseppe87 13 feb. 2017 a las 15:03

2 respuestas

La mejor respuesta

Para que Angular envíe la cookie junto con la solicitud en un CORS (solicitud de intercambio de recursos de origen cruzado), debe establecer, en su configuración, con $httpProvider inyectado como dependencia:

.config(function ($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
    //rest of route code
}
2
Luca Puddu 13 feb. 2017 a las 13:38

Cuando usa Laravel, no tiene que configurar la cookie csrf usted mismo. Laravel automáticamente hace este trabajo por usted.

Entonces laravel crea automáticamente una cookie para almacenar el token csrf. El nombre de esa cookie es "XSRF-TOKEN".

0
flienky 13 feb. 2017 a las 12:15