Objectifs de la séance ¶
- Configurer
CORS
sur l'API enSymfony
- Configurer les cookies de session sur l'API en
Symfony
- Ajouter les exceptions de sécurité nécessaires dans le navigateur
- Ajouter les exceptions de cookies tiers nécessaires dans le navigateur
Introduction ¶
Pour obtenir facilement une authentification sur une application React
basée sur une API, il est possible d'utiliser le moteur d'authentification de Symfony
et de maintenir le mode connecté avec les données de session et donc un cookie de session. Ceci nécessite néanmoins un peu de configuration pour se conformer aux règles de sécurité de partage des cookies tiers.
Configuration de l'API en Symfony
¶
L'API en Symfony
doit être configurée pour que les cookies de session contiennent l'attribut « SameSite
» ayant pour valeur « None
» et qu'ils soient ainsi envoyés par le navigateur quel que soit le contexte. Votre frontal React
transmettra donc le cookie de session lors des « fetch()
» sur l'API. Pour que ceci fonctionne, votre API doit obligatoirement être servie en HTTPS et ceci va engendrer quelques éléments de configuration supplémentaires.
- Dans «
config/packages/framework.yaml
», modifiez les valeurs de «cookie_secure
» et «cookie_samesite
» pour obtenir :session: cookie_secure: true cookie_samesite: none
- Dans «
config/packages/nelmio_cors.yaml
», ajoutez «allow_credentials
» :nelmio_cors: defaults: allow_credentials: true
- Supprimez l'option «
--no-tls
» de «symfony serve
» dans vos scriptsComposer
si elle était présente :"scripts": { "start": [ "Composer\Config::disableProcessTimeout", "symfony serve" ],
Gestion du certificat du serveur Web de l'API dans le navigateur ¶
Votre serveur d'API devant fonctionner en HTTPS
, le certificat autosigné proposé par « symfony serve
» sera jugé dangereux par votre navigateur qui refusera d'établir une communication avec le serveur d'API. Il faut donc ajouter une exception dans le navigateur pour pouvoir consulter la version de développement de votre API. Lorsque cette dernière sera en production, vous devrez disposer d'un certificat valide pour que tous les visiteurs puissent la consulter.
- Démarrez votre serveur d'API après avoir effectué les modifications de la partie précédente
- Vérifiez si votre serveur d'API démarre avec l'erreur suivante:
symfony serve
[WARNING] run "symfony server:ca:install" first if you want to run the web server with TLS support, or use "--p12" or "--no-tls" to avoid this warning - Si c'est le cas, arrêtez-le et lancez la commande proposée puis annulez la saisie du mot de passe «
sudo
» avec «CTRL + C
»symfony server:ca:install You might have to enter your root password to install the local Certificate Authority certificate Sudo password:
- Si nécessaire, redémarrez votre serveur d'API
- Consultez votre API dans le navigateur : «
https://127.0.0.1:8000/
» - Constatez l'avertissement du navigateur (ici, sur Chrome) :
- Cliquez sur « Advanced » pour pouvoir accepter l'exception :
Gestion du cookie de session du serveur Web de l'API dans le navigateur ¶
La politique actuelle de lutte contre les cookies tiers, qui permettent de tracer vos visites sur Internet, va bloquer le fonctionnement de la session sur le serveur Web de l'API lorsque cette dernière est interrogée par votre application React
. En effet, les deux serveurs fonctionnent sur des ports différents et sont donc vus comme deux serveurs distincts qui ne doivent donc pas se transmettre de cookies tiers. Vous allez ajouter une exception de transmission des cookies tiers vers le serveur d'API.
- Dans les préférences du navigateur, accédez aux exceptions de cookies tiers dans « Privacy and security » (ici, sur Chrome) :
- Cliquez pour ajouter une exception (ici, sur Chrome) :
- Ajoutez une exception pour «
http://127.0.0.1:8000/
» (ici, sur Chrome) :
Configuration de l'URL de l'API dans l'application React
¶
L'application React
doit accéder à l'API qui est servie par « https://127.0.0.1:8000/api
».
- Modifiez la constante JavaScript qui désigne la base de l'URL du serveur d'API :
export const BASE_URL = 'https://127.0.0.1:8000/api';
Remarque importanteL'URL désignée dans l'application React doit correspondre exactement à celle utilisée pour les exceptions de certificat et de cookie tiers. Si vous avez utilisé «
127.0.0.1
», ce n'est pas le même nom de serveur que «localhost
», bien qu'ils correspondent à la même adresse. - Lancez votre serveur
React
- Testez l'accès à l'API depuis un «
fetch()
» - Testez l'authentification et le maintien de la session grâce au cookie de session