Implémente https://github.com/fruitcake/php-cors pour Laravel
Depuis Laravel 9.2, ce Middleware est inclus dans laravel/framework. Vous pouvez utiliser le middleware fourni, qui doit être compatible avec le middleware et la configuration fournis dans ce package. Voir https://github.com/laravel/laravel/pull/5825/files pour les modifications.
Étapes de mise à niveau :
Supprimez "fruitcake/laravel-cors"
de votre composer.json
Remplacez FruitcakeCorsHandleCors::class,
par IlluminateHttpMiddlewareHandleCors::class,
dans app/Http/Kernel.php
Voir https://github.com/fruitcake/php-cors
pour une utilisation avancée. La configuration reste la même.
Le package laravel-cors
vous permet d'envoyer des en-têtes Cross-Origin Resource Sharing avec la configuration du middleware Laravel.
Si vous souhaitez avoir un aperçu global du flux de travail CORS, vous pouvez parcourir cette image.
Lors de la mise à niveau à partir des versions 0.x, il y a quelques changements importants :
Une nouvelle propriété « chemins » est utilisée pour activer/désactiver CORS sur certaines routes. Celui-ci est vide par défaut, alors remplissez-le correctement !
Le middleware de groupe n'est plus pris en charge, utilisez le middleware global
Le nom du fournisseur a changé (voir installation/utilisation)
Le boîtier des accessoires dans cors.php
est passé de camelCase à Snake_case, donc si vous avez déjà un fichier cors.php
vous devrez mettre à jour les accessoires pour qu'ils correspondent au nouveau boîtier.
Gère les demandes OPTIONS de pré-vol CORS
Ajoute des en-têtes CORS à vos réponses
Faites correspondre les itinéraires pour ajouter CORS uniquement à certaines requêtes
Exigez le package fruitcake/laravel-cors
dans votre composer.json
et mettez à jour vos dépendances :
le compositeur a besoin de fruitcake/laravel-cors
Si vous rencontrez un conflit, cela peut être dû au fait qu'une ancienne version de barryvdh/laravel-cors ou fruitcake/laravel-cors est installée. Supprimez d'abord le package en conflit, puis réessayez l'installation :
compositeur supprimer barryvdh/laravel-cors fruitcake/laravel-cors le compositeur a besoin de fruitcake/laravel-cors
Pour autoriser CORS pour toutes vos routes, ajoutez le middleware HandleCors
en haut de la propriété $middleware
de la classe app/Http/Kernel.php
:
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
Mettez maintenant à jour la configuration pour définir les chemins sur lesquels vous souhaitez exécuter le service CORS (voir Configuration ci-dessous) :
'chemins' => ['api/*'],
Les valeurs par défaut sont définies dans config/cors.php
. Publiez la configuration pour copier le fichier dans votre propre configuration :
fournisseur artisanal php :publish --tag="cors"
Remarque : lorsque vous utilisez des en-têtes personnalisés, tels que
X-Auth-Token
ouX-Requested-With
, vous devez définirallowed_headers
pour inclure ces en-têtes. Vous pouvez également le définir sur['*']
pour autoriser tous les en-têtes personnalisés.
Remarque : Si vous mettez explicitement les en-têtes sur liste blanche, vous devez inclure
Origin
, sinon les demandes ne seront pas reconnues comme CORS.
Option | Description | Valeur par défaut |
---|---|---|
chemins | Vous pouvez activer CORS pour 1 ou plusieurs chemins, par exemple. ['api/*'] | [] |
méthodes_autorisées | Correspond à la méthode de requête. | ['*'] |
origines_autorisées | Correspond à l’origine de la demande. Des caractères génériques peuvent être utilisés, par exemple. *.mydomain.com ou mydomain.com:* * | ['*'] |
modèles_origines_autorisés | Correspond à l'origine de la demande avec preg_match . | [] |
autorisé_headers | Définit l’en-tête de réponse Access-Control-Allow-Headers. | ['*'] |
exposés_headers | Définit l’en-tête de réponse Access-Control-Expose-Headers. | [] |
âge_maximum | Définit l’en-tête de réponse Access-Control-Max-Age. | 0 |
supports_credentials | Définit l’en-tête Access-Control-Allow-Credentials. | false |
allowed_origins
, allowed_headers
et allowed_methods
peuvent être définis sur ['*']
pour accepter n'importe quelle valeur.
Remarque : Pour
allowed_origins
vous devez inclure le schéma lorsque vous n'utilisez pas de caractère générique, par exemple.['http://example.com', 'https://example.com']
. Vous devez également tenir compte du fait que le schéma sera présent lors de l'utilisationallowed_origins_patterns
.
Remarque : essayez d'être aussi précis que possible. Vous pouvez commencer à développer avec des contraintes lâches, mais il vaut mieux être le plus strict possible !
Remarque : En raison du remplacement de la méthode http dans Laravel, l'autorisation des méthodes POST permettra également aux utilisateurs de l'API d'effectuer également des requêtes PUT et DELETE.
Remarque : Il est parfois nécessaire de spécifier le port (lorsque vous codez votre application dans un environnement local par exemple) . Vous pouvez également spécifier le port ou utiliser un caractère générique, par exemple.
localhost:3000
,localhost:*
ou même en utilisant un FQDNapp.mydomain.com:8080
Sur Lumen, enregistrez simplement le ServiceProvider manuellement dans votre fichier bootstrap/app.php
:
$app->register(FruitcakeCorsCorsServiceProvider::class);
Copiez également le fichier de configuration cors.php dans config/cors.php
et mettez-le en action :
$app->configure('cors');
Pour autoriser CORS pour toutes vos routes, ajoutez le middleware HandleCors
au middleware global et définissez la propriété paths
dans la configuration.
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
Assurez-vous que l'option path
dans la configuration est correcte et correspond réellement à l'itinéraire que vous utilisez. N'oubliez pas de vider également le cache de configuration.
Parfois, des erreurs/middleware qui renvoient leurs propres réponses peuvent empêcher l’exécution du middleware CORS. Essayez de modifier l'ordre du middleware et assurez-vous qu'il s'agit de la première entrée du middleware global, et non d'un groupe de routage. Vérifiez également vos journaux pour les erreurs réelles, car sans CORS, les erreurs seront avalées par le navigateur, affichant uniquement les erreurs CORS. Essayez également de l'exécuter sans CORS pour vous assurer qu'il fonctionne réellement.
Si votre demande inclut un en-tête Authorization ou utilise le mode Credentials, définissez la valeur supports_credentials
dans la configuration sur true. Cela définira l’en-tête Access-Control-Allow-Credentials sur true
.
Si vous utilisez echo()
, dd()
, die()
, exit()
, dump()
etc. dans votre code, vous interromprez le flux Middleware. Lorsque la sortie est envoyée avant les en-têtes, CORS ne peut pas être ajouté. Lorsque le script se termine avant la fin du middleware CORS, les en-têtes CORS ne seront pas ajoutés. Renvoyez toujours une réponse appropriée ou lancez une exception.
Si possible, utilisez un groupe de routage avec la protection CSRF désactivée. Sinon vous pouvez désactiver CSRF pour certaines requêtes dans AppHttpMiddlewareVerifyCsrfToken
:
protégé $sauf = ['api/*','sub.domain.zone' => [ 'prefix/*'], ];
Le middleware CORS devrait être le seul endroit où vous ajoutez ces en-têtes. Si vous ajoutez également des en-têtes dans .htaccess, nginx ou votre fichier index.php, vous obtiendrez des en-têtes en double et des résultats inattendus.
Si vous n'effectuez pas de requêtes Cross-Site, c'est-à-dire si vous ne demandez pas site-a.com/api à site-b.com, votre navigateur n'enverra pas l'en-tête de requête Origin: https://site-b.com
, CORS sera "désactivé" car l'en-tête Access-Control-Allow-Origin
sera également manquant. Cela se produit parce que les demandes sont expédiées à partir de celui-ci et qu'aucune protection n'est nécessaire dans ce cas.
Publié sous licence MIT, voir LICENCE.