Recherche…


Remarques

Les cookies font partie de la requête HTTP, c'est donc une bonne idée de faire les deux dans le contrôleur dont la responsabilité concerne exactement la demande et la réponse.

Pour définir un cookie, c'est-à-dire le créer et planifier son envoi au navigateur, vous devez créer une nouvelle instance de classe \yii\web\Cookie et l'ajouter à la collection de cookies de réponse:

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie!',
    'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

Dans ce qui précède, nous passons des paramètres au constructeur de classe de cookie. Celles-ci sont fondamentalement les mêmes que celles utilisées avec la fonction PHP setcookie native :

  • name - nom du cookie.
  • value - valeur du cookie. Assurez-vous que c'est une chaîne. Les navigateurs ne sont généralement pas satisfaits des données binaires dans les cookies.
  • domain - domain pour lequel vous définissez le cookie.
  • expire - horodatage unix indiquant l'heure à laquelle le cookie doit être automatiquement supprimé.
  • path - le chemin sur le serveur sur lequel le cookie sera disponible.
  • secure - si true , le cookie sera défini uniquement si HTTPS est utilisé.
  • httpOnly - si true , le cookie ne sera pas disponible via JavaScript.

Pour lire un cookie, utilisez le code suivant:

$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');

Remarque: ce code permet de lire les cookies qui ont été définis à l'aide du composant cookie (car il signe tous les cookies par défaut). Par conséquent, si vous ajoutez / mettez à jour un cookie en utilisant le code JS, vous ne pouvez pas le lire en utilisant cette méthode (par défaut).

Cookies pour les sous-domaines

Pour des raisons de sécurité, par défaut, les cookies ne sont accessibles que sur le même domaine que celui dans lequel ils ont été définis. Par exemple, si vous avez défini un cookie sur le domaine example.com , vous ne pouvez pas l'obtenir sur le domaine www.example.com . Donc, si vous prévoyez d'utiliser des sous-domaines (par exemple, admin.exemple.com, profil.exemple.com), vous devez définir explicitement le domain :

$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);

Maintenant, les cookies peuvent être lus à partir de tous les sous-domaines de example.com .

Authentification par sous-domaines et cookies d'identité

En cas de connexion automatique ou de "souvenir de moi", les mêmes quirks que dans le cas des cookies de sous-domaines s'appliquent. Mais cette fois, vous devez configurer le composant utilisateur, en définissant le tableau identityCookie sur la configuration de cookie souhaitée.

Ouvrez votre fichier de configuration d'application et ajoutez identityCookie paramètres identityCookie à la configuration du composant utilisateur:

$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,
            ],
        ],

    ],
];

Notez que cookieValidationKey doit être identique pour tous les sous-domaines.

Notez que vous devez configurer la propriété session::cookieParams pour que le samedomain devienne votre user::identityCookie afin de garantir la login et la logout pour tous les sous-domaines. Ce comportement est mieux expliqué dans la section suivante.

Les paramètres de cookies de session sont importants à la fois si vous avez besoin de maintenir une session tout en passant d'un sous-domaine à un autre ou si, au contraire, vous hébergez l'application backend sous l'URL /admin et souhaitez gérer la session séparément.

$config = [
    // ...
    'components' => [
        // ...
        'session' => [
            'name' => 'admin_session',
            'cookieParams' => [
                'httpOnly' => true,
                'path' => '/admin',
            ],
        ],
    ],
];


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow