yii2
Galletas
Buscar..
Observaciones
Las cookies son parte de la solicitud HTTP, por lo que es una buena idea hacer ambas cosas en el controlador, cuya responsabilidad es tratar con la solicitud y la respuesta.
Configurando una cookie
Para configurar una cookie, es decir, para crearla y programar el envío al navegador, debe crear una nueva instancia de clase \yii\web\Cookie y agregarla a la colección de cookies de respuesta:
$cookie = new Cookie([
'name' => 'cookie_monster',
'value' => 'Me want cookie!',
'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);
En lo anterior estamos pasando parámetros al constructor de la clase de cookie. Estos son básicamente los mismos que se utilizan con la función nativa de setcookie de PHP:
-
name- nombre de la cookie. -
value- valor de la cookie. Asegúrate de que sea una cuerda. Los navegadores normalmente no están contentos con los datos binarios en las cookies. -
domain- dominio para el que está configurando la cookie. -
expire: la marca de tiempo de Unix que indica la hora en que se debe eliminar automáticamente la cookie. -
path: la ruta en el servidor en el que estará disponible la cookie. -
secure: si estrue, la cookie se configurará solo si se usa HTTPS. -
httpOnly: si estrue, la cookie no estará disponible a través de JavaScript.
Leyendo una galleta
Para leer una cookie usa el siguiente código:
$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');
Nota: este código permite leer las cookies que se han configurado mediante el componente de cookies (porque las firma de forma predeterminada). Por lo tanto, si agrega / actualiza una cookie usando el código JS, no puede leerlo usando este método (por defecto).
Galletas para subdominios
Por razones de seguridad, de forma predeterminada, las cookies son accesibles solo en el mismo dominio desde el que se configuraron. Por ejemplo, si ha configurado una cookie en el dominio example.com , no puede obtenerla en el dominio www.example.com . Entonces, si planea usar subdominios (es decir, admin.example.com, profile.example.com), necesita establecer el domain explícitamente:
$cookie = new Cookie([
'name' => 'cookie_monster',
'value' => 'Me want cookie everywhere!',
'expire' => time() + 86400 * 365,
'domain' => '.example.com' // <<<=== HERE
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);
Ahora las cookies se pueden leer en todos los subdominios de example.com .
Autenticación entre subdominios y cookies de identidad
En el caso de las cookies de autologin o "recordarme", se aplican las mismas peculiaridades que en el caso de las cookies de subdominio. Pero esta vez necesita configurar el componente de usuario, configurando la matriz identityCookie a la configuración de cookie deseada.
Abra su archivo de configuración de la aplicación y agregue los parámetros de identityCookie a la configuración del componente de usuario:
$config = [
// ...
'components' => [
// ...
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'loginUrl' => '/user/login',
'identityCookie' => [ // <---- here!
'name' => '_identity',
'httpOnly' => true,
'domain' => '.example.com',
],
],
'request' => [
'cookieValidationKey' => 'your_validation_key'
],
'session' => [
'cookieParams' => [
'domain' => '.example.com',
'httpOnly' => true,
],
],
],
];
Tenga en cuenta que cookieValidationKey debe ser el mismo para todos los subdominios.
Tenga en cuenta que debe configurar la propiedad session::cookieParams para que samedomain sea su user::identityCookie para garantizar que el login logout y el logout funcionen en todos los subdominios. Este comportamiento se explica mejor en la siguiente sección.
Parámetros de cookie de sesión
Los parámetros de las cookies de sesión son importantes tanto si necesita mantener la sesión mientras pasa de un subdominio a otro o cuando, por el contrario, aloja la aplicación back-end en /admin URL y desea manejar la sesión por separado.
$config = [
// ...
'components' => [
// ...
'session' => [
'name' => 'admin_session',
'cookieParams' => [
'httpOnly' => true,
'path' => '/admin',
],
],
],
];