¿Cómo solucionar “Este conjunto de cookies se bloqueó debido a las preferencias del usuario” en Chrome? (Inicio de sesión de SSO de Stackoverflow/Solicitud de Ajax CORS)

5 minutos de lectura

Avatar de usuario de Avatar
Avatar

Parece que la reciente actualización de Chrome a la versión 83.0.4103.116 trajo un cambio en el manejo de cookies.

Estoy proporcionando un inicio de sesión único para mis usuarios que los registra en varios sitios web. Similar a Stackoverflow, estoy haciendo un Solicitud AJAX con Jquery:

crossDomain: true, 
xhrFields: { withCredentials: true },

Y en PHP permito el dominio:

// needed for cross-domain request
header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Credentials: true');

Sin embargo, ahora ya no funciona.

En la consola de desarrollo encontré una nueva advertencia con la información sobre herramientas:

“Este Set-Cookie fue bloqueado debido a las preferencias del usuario”

información sobre herramientas de advertencia de cromo

¿Cómo arreglar esto?

Actualizar:

¡Acabo de ver que el inicio de sesión único de Stackoverflow tampoco funciona!

ingrese la descripción de la imagen aquí

PD: una pregunta relacionada sugiere decirles a sus usuarios que cambien la configuración de Chrome, desde mi punto de vista, me gustaría evitar esto. Imagínese SO informando a millones de usuarios para habilitar las Cookies para hacer un inicio de sesión único…

  • @Jay Blanchard: Dije específicamente que no se trata de cambiar la configuración de Chrome (que es una respuesta aceptada en la otra pregunta). Y no trata con el inicio de sesión único, Ajax y PHP. – Por favor, sea tan amable y elimine la bandera de cierre.

    – avatar

    25 de junio de 2020 a las 14:54


  • ¿Investigaste todos los duplicados y descubriste que ninguno te pertenecía?

    – Jay Blanchard

    25 de junio de 2020 a las 14:57

  • Por supuesto. Por ejemplo, stackoverflow.com/… o google google.com/… … Y nuevamente, solo para señalar la importancia, todos los usuarios de SO/Stackexchange se verán afectados.

    – avatar

    25/06/2020 a las 15:00


  • Parece que la configuración predeterminada de instalación limpia en Chrome es bloquear las cookies de terceros (todas). Lo que puede ser un aumento para sus requisitos de SameSite en una actualización de versión posterior. Supongo que esto es para proteger a los usuarios de sí mismos, lo que plantea un pequeño problema cuando Chrome decide que una de sus propias cookies es una cookie de terceros (cookie configurada desde un dominio que no es el dominio actual).

    – sombrero increíble

    25 de junio de 2020 a las 15:13

  • @FunkFortyNiner No, necesitamos una solución técnica. Habrá muchos sitios web/desarrolladores que se encontrarán con el mismo problema en los próximos días.

    – avatar

    25 de junio de 2020 a las 15:19

Avatar de usuario de AML
LMA

Si solo puede replicar esto en modo de incógnito y la respuesta de Pierre Pretorius no ayudó, probablemente se esté viendo afectado por un cambio en Chrome 83 donde las cookies de terceros están bloqueadas de manera predeterminada en el modo de incógnito. Ver https://angel.co/today/stories/chrome-83-llega-con-configuraciones-de-seguridad-rediseñadas-cookies-de-terceros-bloqueadas-en-incognito-21796

No creo que puedas hacer mucho para cambiar esto, y Google tiene la intención de hacer de este el comportamiento predeterminado en el futuro: https://www.theverge.com/2020/1/14/21064698/google-third-party-cookies-chrome-two-years-privacy-safari-firefox

EDITAR: Google no implementará esto hasta al menos 2023 https://blog.google/products/chrome/updated-timeline-privacy-sandbox-milestones/

El sitio que está pasando el set-cookie El encabezado HTTP también necesita pasar el SameSite como None y también Securede lo contrario, la cookie no se guarda y se ignora.

Set-Cookie: qa_session=...; SameSite=None; Secure

Antes de hacerlo, lea las implicaciones de seguridad:
https://blog.heroku.com/chrome-changes-samesite-cookie

Ejemplo de código PHP (fuente):

function setcookieSameSite($name, $value, $expire, $path, $domain, $secure, $httponly, $samesite="None")
{
  if (PHP_VERSION_ID < 70300) {
        setcookie($name, $value, $expire, "$path; samesite=$samesite", $domain, $secure, $httponly);
  }
  else {
      setcookie($name, $value, [
          'expires' => $expire,
          'path' => $path,
          'domain' => $domain,
          'samesite' => $samesite,
          'secure' => $secure,
          'httponly' => $httponly,
      ]);
   }
}

  • Aún así, hay algo que a mi navegador no le gusta. La cookie viene así: Set-Cookie: JSESSIONID=somevaluehere; path=/my-site-path;SameSite=None;Secure pero el navegador aún dice que no quiere configurarlo. Nota: el re/rsp está dentro de un iframe.

    – Víctor

    16 oct 2020 a las 12:51

  • Lo arreglé: el problema era que estaba probando en modo Incógnito en Chrome. Además, había una configuración predeterminada en Chrome que especificaba que el modo de incógnito no debería aceptar cookies de terceros. Entonces, he habilitado la opción y las cookies ahora están guardadas.

    – Víctor

    16 oct 2020 a las 14:26

  • para PHP 5.6.40 Si no tiene problemas para reconstruir el binario de PHP, logré portar esta característica de PHP 7.3 a PHP 5.6.40, y ahora hay una solicitud de extracción. Vea la respuesta completa aquí: stackoverflow.com/a/64960472/1641763

    – nadir

    22 de noviembre de 2020 a las 23:28

Seleccione la primera opción en “Cookies y otros datos del sitio” en la configuración de Chrome que es “Permitir todas las cookies”, funcionó para mí.

Mira esta imagen

Esto sucede cuando es posible que tenga habilitado “Bloquear cookies de terceros” en el navegador. Puedes comprobar esto en:

Settings → Site Settings → Cookies and site data → Block third-party cookies

o También disponible a través de:

chrome://settings/content/cookies

Cambie esta configuración a “Permitir todas las cookies”

Avatar de usuario de Nadir
Nadir

Esto se debe a un cambio importante en el manejo de cookies para ayudar a mitigar CSRF. Siguiendo este borrador: https://datatracker.ietf.org/doc/html/draft-west-first-party-cookies-07

Las soluciones alternativas anteriores no funcionarán (la función setcookieSameSite) porque necesita configurar el indicador del mismo sitio en el identificador de sesión (puedo ver que PHPSESSID también tiene este mensaje, es decir, “Esta cookie de conjunto fue bloqueada debido a las preferencias del usuario”). ¿O tal vez probando la ruta session_set_cookie_params? (no probado).

En peculiar para Rama PHP 5.6debe establecer el atributo de cookie de la sesión.

Por cierto, parece que la cookie qa_session en su captura de pantalla es una cookie aleatoria, para esta está bien usar la respuesta de @Pierre-Pretorius, funcionará.

para PHP 5.6.40, vea mi otra respuesta aquí: https://stackoverflow.com/a/64960472/1641763

¿Ha sido útil esta solución?